加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – BufferedReader不读取文件中的所有行

发布时间:2020-12-14 05:45:16 所属栏目:Java 来源:网络整理
导读:我试图在 Android 6中读取/ proc / net / xt_qtaguid / stats. 使用cat命令,我得到这个: 2 a0 0 0 123456 311 48329 737 48 13 b0 0 0 0 0 0 0 04 c0 123456 311 48329 737 48 15 d0 222221 111 22222 222 33 1 我的java代码尝试逐行读取文件: File sysDat
我试图在 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

为什么?

解决方法

I am trying to read /proc/net/xt_qtaguid/stats in Android 6.

在Linux中,/ proc /下的文件实际上不是文件:它们由procfs处理,procfs是一个特殊的文件系统,每次读取或写入文件条目时都执行代码(代码是内核模块中定义的回调函数).所以这些伪文件不像常规文件那样是静态的,而是完全动态的.大小提供了一个有趣的线索:(大多数)这些文件的长度为0(如ls -l所示),但在阅读时它们会显示一些内容.

简而言之,可以预期从2个不同的上下文中读取相同的文件会产生2个不同的结果.

在这种情况下,“文件”回调由xt_qtaguid module for Android处理,其管理“每应用程序/委托数据使用监视”.

This answer说:

this virtual file’s read_proc function limit the uid,every application can only read the header and its own line.

第一部分有点模糊,但似乎表明差异是基于用户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:

In the case of applications that provide network data transfer as a service,such as the download manager,media streaming service,etc,it is possible to attribute the ownership of the network data transfer to the UID of the requesting application using the TrafficStats.setThreadStatsUid() function call. The caller must hold the android.permission.MODIFY_NETWORK_ACCOUNTING permission to re-assign the ownership of the network traffic.

因此,进程/应用程序可以使用TrafficStats.setThreadStatsUid()以从该文件中获取更多行,但这需要MODIFY_NETWORK_ACCOUNTING权限.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读