Usando BufferedReader.available()
según lo sugerido por Sibbo no es fiable. Documentación de available()
estados:
devoluciones una estimación de el número de bytes que se pueden leer ... Nunca es correcto usar el valor de retorno de este método para asignar un búfer.
En otras palabras, no puede confiar en este valor, por ejemplo, puede devolver 0
incluso si algunos caracteres están realmente disponibles.
Investigué un poco y, a menos que pueda cerrar el flujo de entrada del proceso desde el exterior, debe recurrir a una lectura asincrónica de un hilo diferente. Puede encontrar un ejemplo de cómo leer sin bloquear línea por línea here.
Actualización: Aquí es una versión simplificada del código desde el enlace anterior:
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;
}
}
}
Supongo que le dará mucho tiempo al usuario para escribir algo. ;) –