Подтвердить что ты не робот

Чтение определенной строки из текстового файла в Java

Есть ли способ прочитать определенную строку из текстового файла? В API или Apache Commons. Что-то вроде:

String readLine(File file, int lineNumber)

Я согласен, что это тривиально для реализации, но это не очень эффективно, особенно если файл очень большой.

4b9b3361

Ответ 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 позволяет нам извлекать определенные строки из файла. В этом ответе приводятся примеры.