Чтение определенной строки из текстового файла в Java
Есть ли способ прочитать определенную строку из текстового файла? В API или Apache Commons.
Что-то вроде:
String readLine(File file, int lineNumber)
Я согласен, что это тривиально для реализации, но это не очень эффективно, особенно если файл очень большой.
Ответы
Ответ 1
String line = FileUtils.readLines(file).get(lineNumber);
но он все еще имеет проблему с эффективностью.
В качестве альтернативы вы можете использовать:
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;
}
}
Это будет немного более эффективным из-за буфера.
Посмотрите Scanner.skip(..)
и попробуйте пропустить целые строки (с регулярным выражением). Я не могу сказать, будет ли он более эффективным - сравните его.
P.S. с эффективностью я имею в виду эффективность памяти
Ответ 2
Не то, чтобы я знал.
Имейте в виду, что нет никакой конкретной индексации файлов о том, где начинается строка, поэтому любой метод утилиты будет таким же эффективным, как:
BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
r.readLine();
}
return r.readLine();
(с соответствующей обработкой ошибок и логикой закрытия ресурсов, конечно).
Ответ 3
Если строки, которые вы читали, имели одинаковую длину, тогда может быть полезно вычисление.
Но в ситуации, когда линии различной длины, я не думаю, что есть альтернатива их чтению по одному, пока счет линии не будет правильным.
Ответ 4
К сожалению, если вы не можете гарантировать, что каждая строка в файле имеет одинаковую длину, вам придется прочитать весь файл или, по крайней мере, до строки, которую вы после.
Единственный способ подсчета строк - искать новые строковые символы в файле, а это означает, что вам придется читать каждый байт.
Можно будет оптимизировать ваш код, чтобы он был аккуратным и читаемым, но под ним вы всегда будете читать весь файл.
Если вы снова и снова будете читать один и тот же файл, вы можете проанализировать файл и создать индекс, хранящий смещения некоторых номеров строк, например, количество байтов, где указаны строки 100, 200 и т.д.
Ответ 5
Поскольку файлы являются байтами, а не ориентированы на линию - любая сложность общих решений будет в лучшем случае O (n), а n - размером файлов в байтах. Вы должны сканировать весь файл и подсчитывать разделители строк, пока не узнаете, какую часть файла вы хотите прочитать.
Ответ 6
guava имеет нечто похожее:
List<String> Files.readLines(File file, Charset charset);
Итак, вы можете сделать
String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
Ответ 7
Использование файловых ресурсов:
File fileFeatures = new File(
"Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
Ответ 8
Если вы собираетесь работать с одним и тем же файлом одинаково (ищет текст в определенной строке), вы можете индексировать свой файл. Номер строки → смещение.
Ответ 9
В соответствии с этим ответом Java 8 позволяет нам извлекать определенные строки из файла. В этом ответе приводятся примеры.