que tienen que estar de acuerdo con @gene, tratar con un BufferedReader y getLine primer lugar, es simple y fácil de código. Solo tenga cuidado de no aliar el arreglo de respaldo entre el resultado de getLine y cualquier operación de subcadena que use. String.substring() es un culpable particularmente común, y he tenido varios byte-arrays de MB bloqueados en la memoria porque una subcadena de 3 caracteres hacía referencia a él.
Suponiendo ASCII, mi preferencia al hacer esto es dejar caer hasta el nivel de bytes. Use mmap para ver el archivo como ByteBuffer
y luego realice un escaneo lineal para 0x20 y 0x0A (suponiendo separadores de línea de estilo Unix). Luego convierta los bytes relevantes a una Cadena. Si está usando un juego de caracteres de 8 bits, es extremadamente difícil ser más rápido que esto.
Si está utilizando Unicode, el problema es bastante más complicado que le recomiendo encarecidamente que use BufferedReader
a menos que ese rendimiento realmente no sea aceptable. Si getLine()
no funciona, entonces considere simplemente hacer un bucle en una llamada al read()
.
Independientemente siempre se debe especificar el juego de caracteres para inicializar un String desde una corriente de bytes externo. Esto documenta su supuesto de conjunto de caracteres explícitamente.Así que recomiendo una modificación menor a la sugerencia del gen, por lo que una de:
int i = Integer.parseInt(new String(buffer, start, length, "US-ASCII"));
int i = Integer.parseInt(new String(buffer, start, length, "ISO-8859-1"));
int i = Integer.parseInt(new String(buffer, start, length, "UTF-8"));
según corresponda.
¿Cada fila contiene exactamente la misma cantidad de caracteres? – cheeken
en realidad no ... – Frank
Estoy perdido. ¿El formato tiene 1 dígito seguido de 1 espacio, etc. con exactamente el mismo número de caracteres en cada línea? – Gene