Utilizzando BufferedReader.available()
come suggerito da Sibbo non è affidabile. Documentazione di available()
stati:
ritorni una stima del numero di byte che possono essere letti ... Non è mai corretto usare il valore di ritorno di questo metodo per allocare un buffer.
In altre parole, non è possibile fare affidamento su questo valore, ad es. Può restituire 0
anche se alcuni caratteri sono effettivamente disponibili.
Ho effettuato alcune ricerche e, a meno che non sia possibile chiudere il flusso di input del processo dall'esterno, è necessario ricorrere a una lettura asincrona da un thread diverso. Puoi trovare un esempio su come leggere senza bloccare riga per riga here.
Aggiornamento: Qui è una versione semplificata del codice dal link qui sopra:
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;
}
}
}
Suppongo che darai tempo all'utente di scrivere effettivamente qualcosa. ;) –