2012-01-26 17 views
13

Descargo de responsabilidad: He revisado todas las preguntas que puedo encontrar y ninguna contesta exactamente esta pregunta. Si encuentra uno, indíquelo y sea amable.¿Usar el archivo o FileReader con escáner?

Así, el Oracle I/O tutorial abre un archivo de texto con el escáner de la siguiente manera:

new Scanner(BufferedReader(FileReader("xanadu.txt"))); 

Pero el Javadoc abre un archivo de texto con el escáner de la siguiente manera:

new Scanner(new File("myNumbers")); 

Sería bueno utilizar el método más simple, especialmente cuando tengo un archivo pequeño y puedo vivir con el búfer más pequeño, pero también he visto a la gente decir que cuando abre un archivo directamente, can't close it. Si ese es el caso, ¿por qué se usa esa expresión idiomática en la documentación oficial?

Editar: También he visto new Scanner(FileReader("blah.txt")); pero esto parece ser lo peor de ambos mundos.

Editar: No estoy tratando de iniciar un debate sobre si usar Scanner o no. Tengo una pregunta sobre cómo usar Scanner. Gracias.

Respuesta

5

Puede consultar la implementación del escáner (JDK se envía con el código fuente). También hay un método close() en la clase Scanner. Esencialmente, los dos enfoques que enumeraste son idénticos para tu caso de uso de lectura de archivos pequeños; simplemente no olvides llamar a close() al final.

+1

Como señaló @Tudor, el archivo no se cierra(): ¿el archivo real se cierra cuando utiliza Scanner de esta manera, o queda el recurso colgando? – orbfish

+3

Sí, si pasa File al constructor de Scanner se usa para abrir la secuencia que se cerraría al llamar al método Scanner.close(). No importa qué constructor uses si llamas a close() correctamente (por ejemplo, desde try/finally) entonces se cerrará correctamente. – maximdim

-2

Existen varias formas de construir un objeto de escáner.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

personalmente no incluso utilizar escáner para la lectura de archivos sin embargo. Mira los tutoriales de BufferedReader. No es muy difícil de entender.

+0

Esto no responde mi pregunta en absoluto. Por favor, lea la pregunta si va a responderla. Nota: hay mucho debate sobre si usar Scanner o BufferedReader. Ambos son proporcionados por Java, estoy tratando de descubrir la mejor práctica de usarlo, no decidir si usarlo. – orbfish

+0

http://docs.oracle.com/javase/tutorial/essential/io/scanning.html – bdabmxican

+0

Sí, lo he leído, no he respondido a mi pregunta, ¡que sabría si leyera mi pregunta! – orbfish

2

La clase File no tiene el método close() porque solo abstrae un archivo de disco. No es una secuencia de entrada al archivo, por lo que no hay nada que cerrar.

+0

Sí, sé que el archivo no se puede cerrar. Entonces, ¿dejas un recurso dando vueltas (como lo sugiere el enlace en la pregunta) o no? – orbfish

+2

No dejes nada por ahí. La clase File es solo un soporte de información para un archivo físico. No es un manejador de archivo. – Tudor

1

Sí, puedes hacer eso.

Básicamente lo hace:

Scanner file = new Scanner(new FileReader("file.txt")); 

Para leer una cadena:

String s = file.next(); 

Cuando haya terminado con el archivo, haga

file.close(); 
1

caballos para los cursos. Desde el escáner javadocs, un escáner es "Un simple escáner de texto que puede analizar tipos primitivos y cadenas utilizando expresiones regulares." Entonces, mi opinión sobre su pregunta es: no importa qué enfoque use, la opción más simple con File es tan buena como la que se encuentra en los tutoriales de Oracle. El escáner es para el tokenización conveniente de archivos de texto, y si su archivo es pequeño, como usted dijo, entonces es perfecto.

Dado que un escáner utiliza expresiones regulares, no se puede esperar un gran rendimiento con él, ya sea que cree un lector de archivos en búfer para el escáner o no.La lectura legible subyacente será close() d (si se puede cerrar, lo que será, si usa el constructor Scanner (File)), y así no tendrá que preocuparse siempre que cierre() su objeto Scanner (o use try-with-resources).

Cuestiones relacionadas