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.

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top