2011-04-20 14 views
16

programa Mi Java está escuchando en la entrada estándar:Cómo canalizar la entrada al programa Java con fiesta

InputStreamReader isReader = new InputStreamReader(System.in); 
BufferedReader bufReader = new BufferedReader(isReader); 
while(true){ 
    try { 
     String inputStr = null; 
     if((inputStr=bufReader.readLine()) != null) { 
      ... 
     } 
     else { 
      System.out.println("inputStr is null"); 
     } 
    } 
    catch (Exception e) { 
     ... 
    } 
} 

Ahora, yo quiero a canalizar la entrada a este programa desde bash. He intentado lo siguiente:

echo "hi" | java -classpath ../src test.TestProgram 

Pero es sólo la impresión inputStr is null infinitas veces. ¿Qué estoy haciendo mal?

Editar 1: pregunta actualizada para incluir más código/contexto.


Edición 2:

Parece que estoy experimentando el mismo problema que esta OP: Command Line Pipe Input in Java

¿Cómo puedo fijar el programa para que pueda canalizar la entrada en para la prueba, pero el funcionamiento el programa normalmente permitirá a los usuarios ingresar también entradas estándar?

+1

que debería funcionar. ¿Es ese tu programa completo? –

+3

Tu código funcionó perfectamente para mí. ¿Qué más estás haciendo en tu código no publicado? – Nishan

+0

¿Hay alguna posibilidad de que el 'test.TestProgram' que esté ejecutando no sea el que está compilando? – trashgod

Respuesta

4

arreglaron. Una vez que se completó la canalización de la entrada, readLine() siguió retornando a null, por lo que el bucle infinito se mantuvo en bucle.

La solución es romper el ciclo infinito cuando readLine() devuelve nulo.

3

¿Qué estoy haciendo mal?

No veo ninguna razón por la que el fragmento se comporte de esa manera. Sospecho que el problema está en algo que no nos ha mostrado ...

Por ejemplo, ¿qué versión de echo está usando? ¿El shell incorporado? ¿El estándar en '/ bin'? ¿Algo funky en tu búsqueda?

Podría intentar algunos experimentos simples para determinar si el problema está en el nivel de shell/comando o dentro de la aplicación de Java; p.ej.

$ echo hi > tmp 
$ cat tmp 
$ java -classpath ../src test.TestProgram < tmp 
$ cat tmp | java -classpath ../src test.TestProgram 

etcetera.

Si ninguno de esos experimentos arroja alguna pista, publique el código fuente real de Java de un pequeño programa que demuestre su problema.

(Y como @trashgod señala con razón, es posible que tenga "la grasa de dedos" el paso de generación, y estar ejecutando una versión del programa que ya no coincide con el código fuente.)

2

Tienes while(true), de modo de bucle infinito es lo que vas a conseguir.

Agregar una break en algún lugar del circuito es una forma de solucionarlo. Pero no es un buen estilo, porque el lector tiene que buscar el ciclo para averiguar si sale y cuándo.

Es mucho mejor para hacer su declaración while muestran claramente lo que la condición de salida es:

String inputStr = ""; 
while(inputStr != null) { 
    inputStr=bufReader.readLine(); 
    if(inputStr != null) { 
     ... 
    } else { 
     System.out.println("inputStr is null"); 
    } 
} 
1

me gusta la respuesta de delgado, sólo tienden manejarlo un poco diferente. esta es una plantilla básica que uso para leer una secuencia de texto, línea por línea.

try { 
    // Wrap the System.in inside BufferedReader 
    // But do not close it in a finally block, as we 
    // did no open System.in; enforcing the rule that 
    // he who opens it, closes it; leave the closing to the OS. 
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
    String line; 
    while ((line = in.readLine()) != null) { 
     // TODO: Handle input line 
    } 

    // Null was received, so loop was aborted. 

} catch (IOException e) { 
    // TODO: Add error handler 
} 

Si estoy leyendo un archivo, lo cambio levemente, para cerrar el archivo como esto

try { 
    File file = new File("some_file.txt"); 

    // Wrap the System.in inside BufferedReader 
    // But do not close it in a finally block, as we 
    // did no open System.in; enforcing the rule that 
    // he who opens it, closes it; leaves the closing to the OS. 
    BufferedReader in = new BufferedReader(new FileReader(file)); 
    try { 
     String line; 
     while ((line = in.readLine()) != null) { 
      // TODO: Handle input line 
     } 

     // Null was received, so loop was aborted. 

    } finally { 
     try { 
      in.close(); 
     } catch (IOException e) { 
     } 
    } 

} catch (IOException e) { 
    // TODO: Add error handler 
} 
Cuestiones relacionadas