Pregunta

¿Hay algún método para leer una línea específica de un archivo de texto? En el API o Apache Commons. Algo así como:

String readLine(File file, int lineNumber)

Estoy de acuerdo que es trivial para poner en práctica, pero no es muy eficiente, especialmente si el archivo es muy grande.

¿Fue útil?

Solución

String line = FileUtils.readLines(file).get(lineNumber);

haría, pero todavía tiene el problema de eficiencia.

Como alternativa, puede usar:

 LineIterator it = IOUtils.lineIterator(
       new BufferedReader(new FileReader("file.txt")));
 for (int lineNumber = 0; it.hasNext(); lineNumber++) {
    String line = (String) it.next();
    if (lineNumber == expectedLineNumber) {
        return line;
    }
 }

Esto será ligeramente más eficiente debido a la memoria intermedia.

Tome un vistazo a Scanner.skip(..) e intentan saltarse líneas enteras (con expresiones regulares). No puedo decir si va a ser más eficiente -. Benchmark

P.S. con eficiencia que significa eficiencia de la memoria

Otros consejos

No es que yo sepa.

Tenga en cuenta que no hay indexación particular sobre los archivos en cuanto a donde la línea se inicia, por lo que cualquier método de utilidad sería exactamente tan eficientes como:

BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
   r.readLine();
}
return r.readLine();

(con apropiada de gestión de errores y la lógica de recursos de cierre, por supuesto).

Si las líneas que estaban leyendo eran todos de la misma longitud, entonces un cálculo podría ser de utilidad.

Sin embargo, en la situación en la que las líneas son de diferentes longitudes, no creo que hay una alternativa para ellos la lectura de uno a la vez hasta que el número de líneas es correcta.

Desafortunadamente, a menos que usted puede garantizar que todas las líneas del archivo es exactamente la misma longitud, vas a tener que leer todo el archivo, o por lo menos hasta la línea que está buscando.

La única manera de contar las líneas es la búsqueda de los caracteres de nueva línea en el archivo, y esto significa que vas a tener que leer cada byte.

Será posible optimizar el código para que sea limpio y fácil de leer, pero en el fondo siempre estarás leyendo todo el archivo.

Si usted va a leer el mismo archivo una y otra vez se podría analizar el archivo y crear un índice almacenar los desplazamientos de determinados números de línea, por ejemplo, el número de bytes de donde las líneas 100, 200 y así sucesivamente son.

Dado que los archivos son bytes y no se orientan línea - cualquier soluciones complejidad general será O (n), en el mejor siendo n el tamaño de los archivos en bytes. Usted tiene que escanear todo el archivo y contar los delimitadores de línea hasta que no sepa qué parte del archivo que desea leer.

guayaba tiene algo similar:

List<String> Files.readLines(File file, Charset charset);

Por lo que puede hacer

String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);

Uso de Utilidades de archivo:

File fileFeatures = new File(
                "Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);

Si va a trabajar con el mismo archivo de la misma manera (en busca de un texto en cierta línea) que puede indexar su archivo. número de línea -> offset.

De acuerdo con esta respuesta , Java 8 nos permite extraer las líneas específicas de un archivo. Se proporcionan ejemplos en esa respuesta.

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