ここに明らかな何かが欠けている場合は申し訳ありません...しかし、このコードスニペットを見てください:
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);
有効な EOL を検出する前に BufferedReader が EOF に遭遇すると思っていたので、これは "readString: null" を出力すると予想していましたが、代わりに "readString: O hai world" を出力しました。これは、 BufferedReader の Javadocs が readLine() が行うと言っていることとは反対のようです。
1 行のテキストを読み取ります。行は、ライン フィード ('\n')、キャリッジ リターン ('\r')、またはキャリッジ リターンの直後のラインフィードのいずれかによって終了すると見なされます。
戻り値: 行終了文字を含まない、行の内容を含む文字列、またはストリームの末尾に到達した場合は null
文字列が '\n' や '\r' で終了するように再解釈される理由がわかりません...誰か教えてください。ありがとう!
編集: いくつかのコンテキストを提供するために、System.in で読み取るように設計された、私が作成した Reader クラスを検証する JUnit テストを作成しようとしています。ByteArrayInputStreams を使用することは、System.in をシミュレートする合理的な方法のように思えました (この関連する SO 投稿を参照してください)。
Reader が行をキャプチャするとき、現在は BufferedReader.readLine() に依存しています。私の目的のために、リーダーの行はすべて「\n」または「\r」で終了している必要があります。EOL なしで EOF に遭遇すると、有効な行に解決されません。したがって、この時点での私の質問は次のとおりだと思います(時間があるときに自分でこれらをさらに詳しくテストしようとしますが、賢い人々が私を助けてくれることを願っています):
- BufferedReader.readLine() は壊れていますか、文書化されていませんか? または、バイト配列が使い果たされたときに、ByteArrayInputStream は何か間違ったものを返していますか?
- Reader をテストするこの方法は間違っていますか? また、System.in に対して使用したときに readLine() が正しく機能することを期待する必要がありますか? 私は、これに対する答えは「はい」であると信じたいと思っています。
- 単体テストのために System.in をシミュレートするより良い方法はありますか?
- InputStream から読み取るときに '\n' と '\r' を厳密に区別する必要がある場合、独自の readLine() メソッドを作成したほうがよいでしょうか? もしこれが本当なら、私は非常に驚くだろう。
再度、感謝します!