BufferedReader.available()
を使用すると、Sibboの提案は信頼できません。 available()
状態のドキュメント:
戻り読み込むことができるバイト数の推定値 ...バッファを確保するために、このメソッドの戻り値を使用することが正しいことはありません。
つまり、一部の文字が実際に使用可能な場合でも、この値に頼ることはできません。たとえば、0
を返すことができます。
私はいくつかの調査を行いました。外部からのプロセス入力ストリームを閉じることができない限り、別のスレッドからの非同期読み取りに頼る必要があります。ライン単位でブロックしないで読む方法の例を見つけることができますhere。
更新:唯一の信頼できる方法は、一方で、ワーカースレッドを起動し、その中に実際の読み取りを行うことであろう
public class NonblockingBufferedReader {
private final BlockingQueue<String> lines = new LinkedBlockingQueue<String>();
private volatile boolean closed = false;
private Thread backgroundReaderThread = null;
public NonblockingBufferedReader(final BufferedReader bufferedReader) {
backgroundReaderThread = new Thread(new Runnable() {
@Override
public void run() {
try {
while (!Thread.interrupted()) {
String line = bufferedReader.readLine();
if (line == null) {
break;
}
lines.add(line);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
closed = true;
}
}
});
backgroundReaderThread.setDaemon(true);
backgroundReaderThread.start();
}
public String readLine() throws IOException {
try {
return closed && lines.isEmpty() ? null : lines.poll(500L, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
throw new IOException("The BackgroundReaderThread was interrupted!", e);
}
}
public void close() {
if (backgroundReaderThread != null) {
backgroundReaderThread.interrupt();
backgroundReaderThread = null;
}
}
}
私はあなたが何かを実際に何かを書くように長い間与えていると思います。 ;) –