簡體   English   中英

BufferedReader不讀取文件中的所有行

[英]BufferedReader doesn't read all lines from file

我試圖在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 111111 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

為什么?

我試圖在Android 6中讀取/proc/net/xt_qtaguid/stats

在Linux中, /proc/下的文件實際上不是文件:它們由procfs處理, procfs是一個特殊的文件系統, 每次讀取或寫入文件條目時都執行代碼 (代碼是內核模塊中定義的回調函數)。 所以這些偽文件不像常規文件那樣是靜態的,而是完全動態的 大小提供了一個有趣的線索:(大部分) 這些文件的長度為0 (如ls -l ),但在閱讀時它們會顯示一些內容。

簡而言之,可以預期從2個不同的上下文中讀取相同的文件會產生2個不同的結果。

在這種情況下,“文件”回調由Androidxt_qtaguid模塊處理, xt_qtaguid模塊管理“每個應用程序/委托數據使用監視”。

這個答案說:

這個虛擬文件的read_proc函數限制了uid,每個應用程序只能讀取標題和自己的行。

第一部分有點模糊,但似乎表明差異是基於用戶ID,並且模塊只會在常規應用程序讀取此文件時“打印”2行數據(請注意Android為每個應用程序分配唯一的用戶ID並在單獨的進程中以該用戶身份運行它 )。

您沒有提供足夠的詳細信息,但我必須假設當您使用cat從adb打印它時,您可能沒有與嘗試從應用程序中讀取它時相同的用戶ID和權限。 我沒有跟蹤確切的實現細節(如果你願意, 可以在這里閱讀這個模塊的源代碼 ),但其他變量可能會起作用。

醫生說

對於提供網絡數據傳輸作為服務的應用程序(例如下載管理器,媒體流服務等),可以使用TrafficStats.setThreadStatsUid()將網絡數據傳輸的所有權歸屬於請求應用程序的UID。 TrafficStats.setThreadStatsUid()函數調用。 調用者必須持有android.permission.MODIFY_NETWORK_ACCOUNTING權限才能重新分配網絡流量的所有權。

因此,進程/應用程序可以使用TrafficStats.setThreadStatsUid()以從該文件中獲取更多行,但這需要MODIFY_NETWORK_ACCOUNTING權限。

由於性能不是問題,最簡單和最安全的選擇是在java中將cat標准輸出重定向到流中並在讀取器中讀取內容。 使用它作為指導: 在Android中運行cat命令

無需修改權限即可提供反引號

readLine()方法讀取直到下一個'\\ n'字符。 假設,如果你有兩個連續的'\\ n'字符,那么readLine() 可能會過早地返回null。 但是,如果是這種情況,那么cat應該在這兩行之間增加一條線。

此時你可以嘗試兩件事:

  1. 檢查charset您的系統文件和您的程序使用是否相同
  2. 改變這個:

     String line = null; while ((line = bufferedReader.readLine()) != null) { // print to console each line System.out.println("Line: " + line); } 

    對此:

     char c = null; while ((c = (char)bufferedReader.read()) != null) { // print to console each char System.out.println("Line: " + c); } 

看看會發生什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM