java - open - Escáner vs BufferedReader
read data from file java (13)
-
BufferedReader probablemente le dará un mejor rendimiento (ya que el escáner se basa en InputStreamReader, busque fuentes).Ups, para leer desde archivos nio. Cuando probé el rendimiento de nio con el rendimiento de BufferedReader para archivos grandes, nio muestra un rendimiento un poco mejor. - Para leer el archivo, pruebe Apache Commons IO.
Por lo que sé, los dos métodos más comunes para leer datos basados en caracteres de un archivo en Java son utilizando Scanner
o BufferedReader
. También sé que el BufferedReader
lee los archivos de manera eficiente mediante el uso de un búfer para evitar operaciones físicas en el disco. Mis preguntas son:
- ¿El
Scanner
funciona tan bien comoBufferedReader
? - ¿Por qué elegiría
Scanner
sobreBufferedReader
o viceversa?
BufferedReader
tiene una memoria búfer significativamente más grande que el escáner. UtiliceBufferedReader
si desea obtener cadenas largas de una secuencia, y useScanner
si desea analizar un tipo específico de token de una secuencia.Scanner
puede usar tokenize utilizando un delimitador personalizado y analizar el flujo en tipos primitivos de datos, mientras queBufferedReader
solo puede leer y almacenar String.BufferedReader
es síncrono mientras queScanner
no lo es. UtiliceBufferedReader
si está trabajando con varios subprocesos.Scanner
oculta IOException mientrasBufferedReader
lanza de inmediato.
En la última versión / construcción de JDK6 (b27), el Scanner
tiene un búfer más pequeño ( 1024 caracteres ) en comparación con el BufferedReader
( 8192 caracteres ), pero es más que suficiente.
En cuanto a la opción, use el Scanner
si desea analizar el archivo, use el BufferedReader
si desea leer el archivo línea por línea. También vea el texto introductorio de sus documentaciones de API antes mencionadas.
- Análisis = interpretar la entrada dada como tokens (partes). Puede devolverle partes específicas directamente como int, string, decimal, etc. Vea también todos esos métodos
nextXxx()
en la claseScanner
. - Lectura = transmisión tonta. Sigue devolviéndote todos los caracteres, que a su vez debes inspeccionar manualmente si deseas hacer coincidir o componer algo útil. Pero si no necesita hacer eso de todos modos, entonces la lectura es suficiente.
Hay diferentes maneras de tomar entrada en java como:
1) BufferedReader 2) Escáner 3) Argumentos de la línea de comandos
BufferedReader Lee el texto de un flujo de entrada de caracteres, almacena en búfer los caracteres para proporcionar una lectura eficiente de los caracteres, matrices y líneas.
Where Scanner es un escáner de texto simple que puede analizar tipos y cadenas primitivas usando expresiones regulares.
Si está escribiendo un simple lector de registro, el lector de almacenamiento intermedio es adecuado. Si está escribiendo un analizador de analizador XML es la opción más natural.
Para obtener más información, consulte:
La clase Scanner es el complemento de la clase Formater (utilizada para convertir datos binarios en texto con formato). El escáner lee la entrada formateada y la convierte en su forma binaria. Aunque siempre ha sido posible leer entradas con formato, requiere más esfuerzo del que prefieren la mayoría de los programadores. Debido a la adición de Scanner, ahora es fácil leer todos los tipos de valores numéricos, cadenas y otros tipos de datos, ya sea que provenga de un archivo de disco, el teclado u otra fuente. El escáner se puede usar para leer la entrada de la consola, un archivo, una cadena o cualquier otra fuente que implemente la interfaz de Readable o ReadableByteChannel. Por ejemplo, puede usar Escáner para leer un número desde el teclado y asignar su valor a una variable.
BufferedReader , por otro lado, es una clase de E / S de flujo de caracteres. Los flujos de caracteres proporcionan una forma conveniente de entrada y salida en términos de caracteres (Unicode). BufferedReader se usa principalmente para tomar información desde la consola, System.in
. Toma un objeto InputStreamReader como un argumento.
La diferencia entre BufferedReader y Scanner son las siguientes:
- BufferedReader está sincronizado pero el escáner no está sincronizado .
- BufferedReader es seguro para subprocesos pero el escáner no es seguro para subprocesos .
- BufferedReader tiene una memoria búfer más grande, pero el escáner tiene una memoria búfer más pequeña .
- BufferedReader es más rápido pero el escáner es más lento en la ejecución .
Código para leer una línea desde la consola:
BufferedReader :
InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br= new BufferedReader(isr); String st= br.readLine();
Escáner :
Scanner sc= new Scanner(System.in); String st= sc.nextLine();
La respuesta a continuación está tomada de Reading from Console: JAVA Scanner vs BufferedReader
Cuando se lee una entrada desde la consola, existen dos opciones para lograrlo. Primero usando Scanner
, otro usando BufferedReader
. Ambos tienen características diferentes. Significa diferencias de cómo usarlo.
Escáner tratado de entrada dada como token. BufferedReader acaba de leer la entrada línea por línea como una cadena. El escáner proporciona capacidades de análisis al igual que nextInt (), nextFloat ().
Pero, ¿cuál es la diferencia entre otros?
- Escáner tratado de entrada dada como token. BufferedReader como línea de secuencia / String
- Escáner tokenizado dada la entrada utilizando expresiones regulares. El uso de BufferedReader debe escribir código extra
- BufferedReader más rápido que Scanner * punto no. 2
- El escáner no está sincronizado, BufferedReader está sincronizado
Escáner viene con JDK versión 1.5 superior.
¿Cuándo se debe usar un escáner o un lector de búfer?
Mire las principales diferencias entre ambos, uno usando tokenizado, otros usando la línea de flujo. Cuando necesite capacidades de análisis, use Escáner en su lugar. Pero, estoy más cómodo con BufferedReader. Cuando necesite leer de un archivo, use BufferedReader, porque es un búfer de uso cuando se lee un archivo. O puede usar BufferedReader como entrada para el escáner.
Las siguientes son las diferencias entre BufferedReader y Scanner
- BufferedReader solo lee datos, pero el escáner también analiza los datos.
- solo puede leer Cadena usando BufferedReader, pero puede leer int, long o float usando Scanner.
- BufferedReader es más antiguo de Scanner, existe desde jdk 1.1 mientras que Scanner se agregó en la versión JDK 5.
- El tamaño del búfer de BufferedReader es grande (8KB) en comparación con 1KB de escáner.
- BufferedReader es más adecuado para leer archivos con cadenas largas, mientras que Scanner es más adecuado para leer entradas de usuarios pequeños desde el símbolo del sistema.
- BufferedReader está sincronizado pero el escáner no lo está, lo que significa que no puede compartir el escáner entre varios subprocesos.
- BufferedReader es más rápido que Scanner porque no pasa tiempo analizando
- BufferedReader es un poco más rápido en comparación con el escáner
- BufferedReader es del paquete java.io y Scanner es del paquete java.util en base a los puntos en los que podemos seleccionar nuestra opción.
Gracias
Prefiero el Scanner
porque no arroja excepciones marcadas y, por lo tanto, su uso se traduce en un código más optimizado.
Sugiero usar BufferedReader
para leer el texto. Scanner
oculta IOException
mientras BufferedReader
lanza de inmediato.
Vea este link , a continuación se cita desde allí:
Un BufferedReader es una clase simple destinada a leer de manera eficiente desde el flujo subyacente. En general, cada solicitud de lectura hecha de un Reader como un FileReader hace que la solicitud de lectura correspondiente se realice en el flujo subyacente. Cada invocación de read () o readLine () puede hacer que los bytes se lean del archivo, se conviertan en caracteres y luego se devuelvan, lo que puede ser muy ineficiente. La eficiencia se mejora apreciablemente si un lector está deformado en un BufferedReader.
BufferedReader está sincronizado, por lo que las operaciones de lectura en un BufferedReader se pueden realizar desde múltiples subprocesos.
Por otro lado, un escáner tiene mucho más queso incorporado; puede hacer todo lo que puede hacer un BufferedReader y al mismo nivel de eficiencia. Sin embargo, además, un Escáner puede analizar la secuencia subyacente para tipos y cadenas primitivas utilizando expresiones regulares. También puede tokenizar el flujo subyacente con el delimitador de su elección. ¡También puede hacer un escaneo hacia delante de la secuencia subyacente sin tener en cuenta el delimitador!
Sin embargo, un escáner no es seguro para subprocesos, tiene que estar sincronizado externamente.
La opción de utilizar un BufferedReader o un escáner depende del código que esté escribiendo, si está escribiendo un simple lector de registro El lector Buffered es adecuado. Sin embargo, si está escribiendo un analizador de analizador XML es la opción más natural.
Incluso mientras lee la entrada, si desea aceptar la entrada del usuario línea por línea y decir simplemente agregarla a un archivo, un BufferedReader es lo suficientemente bueno. Por otro lado, si desea aceptar la entrada del usuario como un comando con múltiples opciones, y luego tiene la intención de realizar diferentes operaciones basadas en el comando y las opciones especificadas, un escáner se adaptará mejor.
Scanner
se utiliza para analizar tokens del contenido del flujo, mientras que BufferedReader
solo lee el flujo y no realiza ningún análisis especial.
De hecho, puede pasar un BufferedReader
a un scanner
como fuente de caracteres para analizar.
Las principales diferencias:
- Escáner
- Un escáner de texto simple que puede analizar tipos y cadenas primitivas usando expresiones regulares.
- Un escáner divide su entrada en tokens usando un patrón delimitador, que por defecto coincide con el espacio en blanco. Los tokens resultantes pueden luego convertirse en valores de diferentes tipos usando los siguientes métodos.
Ejemplo
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("//s*fish//s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
imprime la siguiente salida:
1
2
red
blue
Con este código se puede generar la misma salida, que usa una expresión regular para analizar los cuatro tokens a la vez:
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input);
s.findInLine("(//d+) fish (//d+) fish (//w+) fish (//w+)");
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(result.group(i));
s.close(); `
BufferedReader:
Lee el texto de una secuencia de entrada de caracteres, y almacena en búfer los caracteres para proporcionar una lectura eficiente de los caracteres, matrices y líneas.
Se puede especificar el tamaño del búfer o se puede usar el tamaño predeterminado. El valor predeterminado es lo suficientemente grande para la mayoría de los propósitos.
En general, cada solicitud de lectura realizada de un Reader hace que se realice una solicitud de lectura correspondiente del carácter subyacente o del flujo de bytes. Por lo tanto, es recomendable envolver un BufferedReader alrededor de cualquier Reader cuyas operaciones de lectura () puedan ser costosas, como FileReaders y InputStreamReaders. Por ejemplo,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
almacenará en búfer la entrada del archivo especificado. Sin el almacenamiento en búfer, cada invocación de read () o readLine () podría hacer que los bytes se lean del archivo, se conviertan en caracteres y luego se devuelvan, lo que puede ser muy ineficiente. Los programas que usan DataInputStreams para la entrada de texto se pueden localizar reemplazando cada DataInputStream con un BufferedReader apropiado.
Fuente: Enlace