java – BufferedReader不读取文件中的所有行
我试图在
Android 6中读取/ proc / net / xt_qtaguid / stats.
使用cat命令,我得到这个: 2 a0 0 0 123456 311 48329 737 48 1 3 b0 0 0 0 0 0 0 0 4 c0 123456 311 48329 737 48 1 5 d0 222221 111 22222 222 33 1 我的java代码尝试逐行读取文件: File sysDataFile = new File(PATH_TO_FILE); BufferedReader bufReader = null; FileReader fileReader = null; try { fileReader = new FileReader(sysDataFile); bufReader = new BufferedReader(fileReader); String line = null; while ((line = bufferedReader.readLine()) != null) { // print to console each line System.out.println("Line: " + line); } } catch (IOException e) { System.out.println("IOException thrown!"); } finally { bufReader.close(); fileReader.close(); } 当我运行上面的代码时,它只打印出控制台中的前两行: Line: 2 a0 0 0 123456 311 48329 737 48 1 Line: 3 b0 0 0 0 0 0 0 0 为什么? 解决方法
在Linux中,/ proc /下的文件实际上不是文件:它们由procfs处理,procfs是一个特殊的文件系统,每次读取或写入文件条目时都执行代码(代码是内核模块中定义的回调函数).所以这些伪文件不像常规文件那样是静态的,而是完全动态的.大小提供了一个有趣的线索:(大多数)这些文件的长度为0(如ls -l所示),但在阅读时它们会显示一些内容. 简而言之,可以预期从2个不同的上下文中读取相同的文件会产生2个不同的结果. 在这种情况下,“文件”回调由 This answer说:
第一部分有点模糊,但似乎表明差异是基于用户ID,并且模块只会在常规应用程序读取此文件时“打印”2行数据(请注意Android assigns a unique user ID to each application and runs it as that user in a separate process). 您没有提供足够的详细信息,但我必须假设当您使用cat从adb打印它时,您可能没有与尝试从应用程序中读取它时相同的用户ID和权限.我没有跟踪确切的实现细节(如果你想,the source for this module can be read here),但其他变量可能会发挥作用. The doc says:
因此,进程/应用程序可以使用TrafficStats.setThreadStatsUid()以从该文件中获取更多行,但这需要MODIFY_NETWORK_ACCOUNTING权限. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |