簡體   English   中英

BufferedReader返回null,即使它正在讀取的流位於pos 0

[英]BufferedReader returns null, even though the stream it's reading from is at pos 0

我試圖將數據從程序MainProgram傳遞給我使用反射調用的另一個程序TestProgram 為此,我將Standard.in重新路由到包含要傳輸的數據的ByteArrayOutputStream 然后, TestProgram使用BufferedReaderreadLine()Standard.in讀取。 我在一個for循環中多次執行整個操作。 問題是這樣的:第一次,一切正常,從第二次開始, TestProgramSystem.in讀取null Java文檔指出,如果到達流的末尾,則BufferedReader將返回null 但是流中肯定有數據,我的ByteArrayOutputStreampos也為0。為什么BufferedReader會突然認為System.in為空或流的末尾?

這是操縱流並調用方法的代碼:

for(int i = 0; i < numberOfCases; i++) {

  Byte[] paramBytes = getCurrentParamBytes();

  InputStream inputStream = new BufferedInputStream(new ByteArrayInputStream(paramBytes));

  System.setIn(inputStream);
  String[] params = null;

  testProgram.invoke(null, (Object) params);
}  

這是從System.in讀取的代碼:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

String current = in.readLine();

我已經使用Eclipse的調試模式向自己保證了System.in ..的狀態,並且一切正常。 TestProgram的main方法的第二次調用開始,它僅讀取null的事實也令我感到困惑。 特別是,由於我檢查的所有值都與第一次完全相同(當然,除了流中的數據)。

遺憾的是,我不能更改BufferedReader的用法,因為TestProgram不是我的類,必須按原樣使用。

任何幫助將不勝感激。

問題可能出在BufferedReader在第一次調用時創建一次的事實。 BufferedReader使用您在循環的第一次迭代中提供的InputStream實例。 在第二次,第三次等調用時,它仍然使用此流,並且不會從更新的System.in讀取。 如果您不能修改TestProgram源代碼,我會看到2種可能的解決方案。

  1. 在每次迭代中創建TestProgram新實例,而不是重復使用舊的實例。 如果將內部BufferedReader存儲為類變量而不是靜態變量,則可能有助於“刷新”內部BufferedReader
  2. 如果由於狀態或狀態變量BufferedReader存儲在靜態變量中而無法創建TestProgram新實例,則可以嘗試以下操作:使用特殊的InputStream ,它允許您動態連接多個InputStreams 檢查ConcatInputStream

第二種方法的示例:

ConcatInputStream concat = new ConcatInputStream();
System.setIn(concat);

for(int i = 0; i < numberOfCases; i++) {

  Byte[] paramBytes = getCurrentParamBytes();

  InputStream inputStream = new BufferedInputStream(new ByteArrayInputStream(paramBytes));

  concat.addInputStream(inputStream);
  String[] params = null;

  testProgram.invoke(null, (Object) params);
}  

我不確定它是否會工作,因為我不知道BufferedReader的行為是什么,如果它在第一次調用時看到流的結尾,然后在第二次調用時突然發現流不再為空(因為我們向其中添加了新的流) concat )。 但是希望它會起作用。

還有第三種方法:您可以使用例如JD來反編譯TestProgram並找到BufferedReader實例的存儲位置。 然后可以使用反射將其設置為零。 但這很容易出錯。

暫無
暫無

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

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