texto - modificar archivos txt en java
Lectura de una línea específica de un archivo de texto en Java (9)
¿Hay algún método para leer una línea específica de un archivo de texto? En la API o Apache Commons. Algo como :
String readLine(File file, int lineNumber)
Estoy de acuerdo en que es trivial de implementar, pero no es muy eficiente especialmente si el archivo es muy grande.
Debido a que los archivos son de byte y no están orientados a la línea, cualquier complejidad de las soluciones generales será O (n) en el mejor de los casos, siendo n el tamaño de los archivos en bytes. Debe escanear todo el archivo y contar los delimitadores de línea hasta que sepa qué parte del archivo desea leer.
Desafortunadamente, a menos que pueda garantizar que cada línea en el archivo tenga exactamente la misma longitud, tendrá que leer todo el archivo, o al menos hasta la línea que está buscando.
La única manera de contar las líneas es buscar los nuevos caracteres de línea en el archivo, y esto significa que tendrá que leer cada byte.
Será posible optimizar su código para que sea ordenado y legible, pero debajo siempre estará leyendo todo el archivo.
Si va a leer el mismo archivo una y otra vez, puede analizar el archivo y crear un índice que almacene los desplazamientos de ciertos números de línea, por ejemplo, el recuento de bytes de donde son las líneas 100, 200 y así sucesivamente.
No que yo supiese.
Tenga en cuenta que no existe una indexación particular en los archivos en cuanto a dónde comienza la línea, por lo que cualquier método de utilidad sería exactamente tan eficiente como:
BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
r.readLine();
}
return r.readLine();
(con lógica apropiada de manejo de errores y cierre de recursos, por supuesto).
Según esta answer , Java 8 nos permite extraer líneas específicas de un archivo. Los ejemplos se proporcionan en esa respuesta.
Si las líneas que estaba leyendo tienen la misma longitud, entonces un cálculo podría ser útil.
Pero en la situación en que las líneas tienen longitudes diferentes, no creo que haya una alternativa para leerlas de una en una hasta que el recuento de líneas sea correcto.
Si va a trabajar con el mismo archivo de la misma manera (buscando un texto en cierta línea), puede indexar su archivo. Número de línea -> desplazamiento.
Usando File Utils:
File fileFeatures = new File(
"Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
guava tiene algo similar:
List<String> Files.readLines(File file, Charset charset);
Entonces puedes hacer
String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
String line = FileUtils.readLines(file).get(lineNumber);
haría, pero todavía tiene el problema de la eficiencia.
Alternativamente, 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á un poco más eficiente debido al buffer.
Eche un vistazo a Scanner.skip(..)
e intente omitir líneas enteras (con regex). No puedo decir si será más eficiente: cotejarlo.
PD con eficiencia me refiero a la eficiencia de la memoria