2011-09-06 14 views

Respuesta

17

Aquí está una manera:

Scanner keyboard = new Scanner(System.in); 
String line = null; 
while(!(line = keyboard.nextLine()).isEmpty()) { 
    String[] values = line.split("\\s+"); 
    System.out.print("entered: " + Arrays.toString(values) + "\n"); 
} 
System.out.print("Bye!"); 
+2

Esto tiene un efecto secundario de obtener la línea ya (por ejemplo, necesitaría dividir la línea por espacios si quiero analizar valores separados por espacios). ¿Hay un método de tipo 'hasNextLine()' donde el "puntero" no pasa a la siguiente línea? –

+0

Err, no entiendo qué hay de malo en dividir la línea ... –

+1

@jiewmeng - cuando llame a 'scanner.hasNext()' necesitará buscar la línea para verificar si está vacía y procesarla. ¿Podrías explicar por qué la respuesta de Bart no funcionaría para ti? – luketorjussen

4

De http://www.java-made-easy.com/java-scanner-help.html:

Q: ¿Qué Qué sucede si escaneo una línea en blanco con el escáner de Java?

A: Depende. Si está utilizando nextLine(), se leerá una línea en blanco como una cadena vacía. Esto significa que si tuviera que almacenar la línea en blanco en una variable String, la variable mantendría "". NO se almacenará en "" ni se colocarán tantos espacios. Si está utilizando next(), , no leerá líneas en blanco. Están completamente salteados.

Mi conjetura es que todavía nextLine() desencadenará en una línea en blanco, ya que técnicamente el escáner tendrá la cadena vacía "". Por lo tanto, puede marcar if s.nextLine().equals("")

0

AlexFZ es correcto, scanner.hasNext() siempre será verdadero y el bucle no finaliza, porque siempre hay entrada de cadena aunque esté vacía "".

que tenían un mismo problema y lo solucioné así:

do{ 
    // process input
}while(line.length()!=0);
creo do-while caben aquí mejor robaba usted tiene que evaluar de entrada cuando el usuario ha entrado en ella.

0
Scanner key = new Scanner(new File("data.txt")); 
String data = ""; 

while(key.hasNextLine()){ 
    String nextLine = key.nextLine(); 

    data += nextLine.equals("") ? "\n" :nextLine; 

} 
System.out.println(data); 
3

El problema con las sugerencias de usar scanner.nextLine() es que en realidad devuelve la siguiente línea como String. Eso significa que cualquier texto que esté allí se consume. Si está interesado en escanear el contenido de esa línea ... ¡muy mal! Debería analizar el contenido del String devuelto usted mismo.

Una mejor manera sería utilizar

while (scanner.findInLine("(?=\\S)") != null) { 
    // Process the line here… 
    … 

    // After processing this line, advance to the next line (unless at EOF) 
    if (scanner.hasNextLine()) { 
     scanner.nextLine(); 
    } else { 
     break; 
    } 
} 

Desde (?=\S) es una afirmación lookahead de anchura cero, que nunca se consume ninguna entrada. Si encuentra un texto que no sea de espacio en blanco en la línea actual, ejecutará el cuerpo del bucle.

Puede omitir el else break; si está seguro de que el cuerpo del bucle ya habrá consumido todo el texto que no sea de espacio en blanco en esa línea.

Cuestiones relacionadas