2012-04-08 14 views
12

¿Alguien sabe si hay alguna diferencia con respecto al rendimiento entre los dos métodos de lectura de archivo de entrada a continuación? Gracias.Escáner vs InputStreamReader

1) Lectura de un archivo con escáner y File

Scanner input = new Scanner(new File("foo.txt")); 

2) Lectura de un archivo con InputStreamReader y FileInputStream

InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt")); 
+1

Relacionados: http://stackoverflow.com/questions/2231369/scanner-vs-bufferedreader –

+0

Relacionados: [Scanner v. StreamTokenizer] (http://stackoverflow.com/a/2082174/230513). – trashgod

Respuesta

7

El primer punto es que ni de esos ejemplos de código leen un archivo. Esto puede sonar fatuo o incorrecto, pero es verdad. Lo que realmente hacen es abrir un archivo para leer. Y en términos de lo que realmente hacen, probablemente no haya una gran diferencia en su eficiencia respectiva.

Cuando se trata de leer el archivo, la mejor manera de usarlo dependerá de qué contenido contenga el archivo, en qué forma deben estar los datos para los algoritmos en memoria, etc. Esto determinará si es mejor para usar Scanner o Reader crudo, desde una perspectiva de rendimiento y más importante aún desde la perspectiva de hacer que su código sea confiable y mantenible.

Por último, es probable que esto no suponga una diferencia significativa en el rendimiento general de su código. Lo que estoy diciendo es que estás optimizando tu aplicación prematuramente. Es mejor que ignore el rendimiento por ahora y elija la versión que simplificará el resto de su código. Cuando la aplicación esté funcionando, perfórela con algunos datos de entrada representativos. La creación de perfiles le indicará el tiempo que pasa leyendo el archivo, en términos absolutos y en relación con el resto de la aplicación. Esto le dirá si es si se merece el esfuerzo para tratar de optimizar la lectura del archivo.

El único consejo de rendimiento que daría es que la lectura carácter por carácter de un flujo de entrada o lector sin búfer es ineficaz. Si el archivo debe leerse de esa manera, debe agregar un BufferedReader a la pila.

2

Una diferencia, y el director, supongo, es que con la BufferedReader/InputStreamReader puede leer todo el documento carácter por carácter, si lo desea. Con el escáner esto no es posible. Significa que con InputStreamReader puede tener más control sobre el contenido del documento. ;)

+2

Esta respuesta no aborda el rendimiento, sin embargo, que es lo que el OP estaba pidiendo. –

+0

@ AdamMihalcin Si su punto es que la respuesta está fuera de tema, no estoy de acuerdo. Él quiere escuchar sobre el rendimiento y también conocer la diferencia entre los dos, lo que a la larga solo beneficia su comprensión de la diferencia entre los dos. – Joop

3

En términos de rendimiento, el escáner es definitivamente el más lento, al menos según mi experiencia. Está hecho para analizar, no leer grandes bloques de datos. InputStreamReader, con un búfer lo suficientemente grande, puede funcionar a la par con BufferedReader, que recuerdo que es un poco más rápido que Scanner para leer desde una lista de diccionarios. Here's a comparison between BufferedReader and InputStreamReader. Recuerde que BufferedReader es unas veces más rápido que Scanner.

Cuestiones relacionadas