很抱歉,如果我失去了一些東西在這裏很明顯......但請看看這個代碼片段:Java BufferedReader.readLine()不等待EOL?
String readString;
String writeString = "O hai world.";
BufferedReader br = new BufferedReader(
new InputStreamReader(
new ByteArrayInputStream(writeString.getBytes()),
"UTF-8"),
1024);
readString = br.readLine();
System.out.println("readString: " + readString);
我預計這將打印「readString:空」,因爲我認爲BufferedReader中會遇到一個EOF在檢測到有效的EOL之前,而是打印出「readString:O hai world」。這看起來與Javadocs for BufferedReader所說的readLine()將做的相反:
讀取一行文本。換行符被換行符('\ n'),回車符('\ r')或回車符後面的換行符中的任何一個結束。
返回: 包含該行的內容,不包括任何行終止符,則返回null流的末尾已到達
我看不出有任何理由的字符串我字符串將被重新解釋爲以'\ n'和/或'\ r'結尾......有人可以照亮我嗎?謝謝!
編輯: 提供一些背景,我試着寫JUnit測試來驗證我寫它的設計上System.in讀閱讀器類。使用ByteArrayInputStreams似乎是模擬System.in的合理方法(請參閱this relevant SO post)。
當我的Reader捕獲一條線時,它當前依賴於BufferedReader.readLine()。出於我的目的,我的讀者必須全部以'\ n'或'\ r'結尾。遇到沒有EOL的EOF不應解析爲有效行。所以我想我現在的問題如下(我會盡量在我有空的時候更詳細地測試這些,但希望你們聰明的人能夠幫助我):
- BufferedReader.readLine()損壞/錯誤記錄?或者ByteArrayInputStream在其字節數組耗盡時返回錯誤的東西?
- 這是測試我的Reader錯誤的方法,我應該期待readLine()在針對System.in使用時能夠正常工作嗎?我傾向於相信答案是肯定的。
- 有沒有更好的方法來模擬System.in進行單元測試?
- 如果我在從InputStream中讀取時需要嚴格區分'\ n'和'\ r',我最好寫自己的readLine()方法嗎?如果是這樣,我會很驚訝。
再次感謝!
你給它一個字符串,你回來的字符串。不去愛的種種 ;)? – paulsm4 2012-07-20 20:43:04
不應readLine()阻止EOL字符?我神奇地插入了一個地方? – jasterm007 2012-07-20 20:45:13
+1因爲在閱讀文檔後,我同意你的意見。 readline()方法也應該提到一個行結束符可以是EOF。 – goat 2012-07-20 20:47:39