HOla!! amigos, tengo un problema con un programita en java, sobre archivos y flujos , pues en un ciclo utilizo el metodo hasNext(), para lea desde el teclado información, hasta q encuentre el indicador de fin de archivo, segun lei la combinación es ctrl+z y luego enter, pero no he podido lograr terminar ese ciclo. Tal vez me pueden ayudar, ya q esa combinación no me indica nada al programa, lo he corrido en netbeans 6.8 y tambien en modo consola.
Ok mira, en java hay dos maneras de leer el fin de archivo.
La primera es leer caracter por caracter, eso lo haces mas o menos asi:
mport java.io.*;
public class InputReaderChar {
public static void main(String args[]) throws Exception {
int caracter;
while((caracter=System.in.read())!=-1) { // read devuelve -1 al leer EOF
System.out.println("Caracter: "+caracter);
}
System.out.println("EOF detectado!");
}
}
Ojo con este codigo!! Aunque lee caracter por caracter la entrada no es procesada hasta que se presiona [Enter], asi que la salida es mas o menos como la siguiente:
mgomez:~/java mxgxw$ java InputReaderChar
a
Caracter: 97
Caracter: 10
b
Caracter: 98
Caracter: 10
c
Caracter: 99
Caracter: 10
<ctrl+d>
EOF detectado!
Fijate que yo uso Ctrl+D pq estoy en una mac, el caracter 10 que aparece es el retorno de carro (la tecla [Enter]. En sistemas Unix EOF es Ctrl+D en Windows es Ctrl+Z.
La otra forma que tenes es leer lineas completas como cadenas de texto. El codigo es muy similar solo que en este caso vas a tener que utilizar las clases InputStreamReader y BufferedReader.
import java.io.*;
public class InputReader {
public static void main(String args[]) throws Exception {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String line;
while((line=br.readLine())!=null) { // readLine devuelve null al leer EOF
System.out.println("Linea: "+line); // aqui procesas la linea de texto
}
System.out.println("EOF detectado!");
}
}
Por que usamos un buffered Reader, bueno el InputStream que nos provee System.in solo nos permite leer caracter por caracter o una cantidad fija de bytes. El BufferedReader nos provee de la funcion readLine que lo que hace es almacenar en un buffer todos los caracteres hasta llegar al fin de linea [Enter] y nos devuelve una cadena de texto.
La diferencia principal es que cuando encuentre EOF en vez de devolvernos -1, como es un objeto nos devolvera null.
Funciona algo asi:
mgomez:~/java mxgxw$ java InputReader
linea de prueba
Linea: linea de prueba
<Ctrl+D>
EOF detectado!