La lectura de un archivo usando el escáner de Java
-
27-09-2019 - |
Pregunta
Una de las líneas en un archivo Java que estoy tratando de entender es la siguiente.
return new Scanner(file).useDelimiter("\\Z").next();
El archivo se espera que regrese hasta "El final de la entrada, pero para el terminador final, si los hay" documentación según java.util.regex.Pattern. Pero lo que sucede es que devuelve sólo los primeros 1024 caracteres del archivo. ¿Es esta una limitación impuesta por el comparador de patrón de expresiones regulares? Puede superar esto? Actualmente voy por delante mediante un FileReader. Pero me gustaría saber la razón de este comportamiento.
Solución
Trate de envolver el objeto file
en un FileInputStream
Otros consejos
Yo mismo, no podía reproducir este. Pero yo creo que pueda arrojar luz sobre lo que está pasando.
A nivel interno, el escáner utiliza un búfer de caracteres de 1024 caracteres. El escáner leerá de sus caracteres legibles 1024 por defecto, si es posible, y luego aplicar el patrón.
El problema está en su patrón ... siempre va a coincidir con el final de la entrada, pero eso no significa el final de su flujo de datos de entrada /. Cuando se aplica el patrón de Java a los datos almacenados temporalmente, se trata de encontrar la primera aparición de la final de la entrada. Desde 1024 caracteres están en el búfer, el motor de juego llama la posición 1024 del primer partido de la delimitador y todo antes de que se devuelve como el primer token.
No creo que el ancla al final de la entrada es válida para su uso en el escáner por esa razón. Podría ser la lectura de un flujo infinito, después de todo.
Scanner
está destinado a leer múltiples primitivas de un archivo. Realmente no está destinado para leer un archivo completo.
Si no desea incluir bibliotecas de terceros, es mejor bucle durante un BufferedReader
que envuelve un FileReader
/ InputStreamReader
para el texto o en un bucle FileInputStream
para datos binarios.
Si estás bien utilizando una biblioteca de terceros, Apache commons-io tiene un < a href = "http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html" rel = "nofollow"> FileUtils
clase que contiene los métodos estáticos < a href = "http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readFileToString%28java.io.File%29" rel = "nofollow"> readFileToString
y readLines
para el texto y readFileToByteArray
para datos binarios ..
Puede utilizar la clase escáner, basta con especificar un char-set al abrir el escáner, es decir:.
Scanner sc = new Scanner(file, "ISO-8859-1");
conversos Java bytes leídos desde el archivo en caracteres utilizando el juego de caracteres especificado, que es el que viene por defecto (de sistema operativo subyacente) si no se da ( fuente ). Todavía no está claro por qué escáner lee sólo 1024 bytes con la que viene por defecto, mientras que con la otra se llega al final de un archivo. De todos modos, funciona bien!