Un BufferedReader es una clase simple destinada a leer eficientemente desde la secuencia subyacente. En general, cada solicitud de lectura realizada por un lector como un FileReader hace que se realice una solicitud de lectura correspondiente a la secuencia subyacente. 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. La eficiencia mejora notablemente si un Reader se deforma en un BufferedReader.
BufferedReader está sincronizado, por lo que las operaciones de lectura en un BufferedReader se pueden realizar de forma segura desde varios subprocesos.
Por otro lado, un escáner tiene mucho más queso incorporado; puede hacer todo lo que un BufferedReader puede hacer y al mismo nivel de eficiencia también. Sin embargo, además, un escáner puede analizar la secuencia subyacente para tipos y cadenas primitivos utilizando expresiones regulares. También puede tokenizar la secuencia subyacente con el delimitador de su elección. ¡También puede hacer un escaneo directo 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 elección de usar un BufferedReader o un Scanner depende del código que esté escribiendo, si está escribiendo un lector de registro simple El lector Buffer es adecuado. Sin embargo, si está escribiendo un analizador XML, el escáner 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.