Java InputStream != 読み取り可能
-
19-09-2019 - |
質問
私は nextInt() などに java.util.Scanner を使用していますが、java.lang.Readable (唯一のコンストラクター引数) を使用している限り、すべて正常に動作していました。ただし、代わりに InputStream を使用するように変更すると、Scanner.nextInt() は返されません。なぜなのかご存知ですか?
InputStream の実装は次のようになります。
private static class ConsoleInputStream extends InputStream {
...
private byte[] buffer;
private int bufferIndex;
public int read() throws IOException {
...
while (...) {
if (buffer != null && bufferIndex < buffer.length) {
return buffer[bufferIndex++]; // THE COMMENT!
}
...
}
...
}
}
コメントによってデータを印刷すると、「12 」の場合は「1」、「2」、「 」などのものが(正しく)得られます。この動作の原因となる、私が知らないスキャナーの接続があるのでしょうか?
解決
のjavadocからのInputStreamのread()メソッドのための
「データの次のバイトを、または-1ストリームの終わりに達した場合は返します。」
私はあなたが決して-1を返していないしていることを推測する?
他のヒント
問題は自分で構築したInputStreamにあると思います。System.in を単に使用するのではなく、独自のシステムを構築したのはなぜですか?
アップデート:
JTextField からの入力が必要でした。
はい、わかった。すでに利用可能なものを文字形式で読み取るために I/O 処理を使用するのは通常は意味がありませんが、Scanner を使用すると作業がいかに楽になるかはわかります。
それでも、おそらく「完成した」InputStream を使用することで、コーディングと手間を省くことができたでしょう。思い浮かぶのは
InputStream is = new ByteArrayInputStream(myTextField.getText().getBytes());
Java I/O は厄介です。Sun の聡明な人々が、その内容のほとんどを要約してまとめてくれたことをうれしく思います。