Чтение определенной строки из текстового файла на Java - PullRequest
21 голосов
/ 26 января 2010

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

String readLine(File file, int lineNumber)

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

Ответы [ 9 ]

17 голосов
/ 26 января 2010
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. эффективность Я имею в виду эффективность памяти

5 голосов
/ 26 января 2010

Не то чтобы я знал.

Имейте в виду, что нет особых указателей на файлы относительно того, где начинается строка, поэтому любой служебный метод будет столь же эффективен, как:

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

(с соответствующей логикой обработки ошибок и закрытия ресурсов, конечно).

1 голос
/ 14 сентября 2015

Использование файловых утилит:

File fileFeatures = new File(
                "Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
1 голос
/ 26 января 2010

гуава имеет нечто похожее:

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

Так что вы можете сделать

String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
1 голос
/ 26 января 2010

Поскольку файлы являются байтовыми, а не ориентированными на строки, любая общая сложность решения будет в лучшем случае O (n), где n - размер файла в байтах Вы должны отсканировать весь файл и считать разделители строк, пока не узнаете, какую часть файла вы хотите прочитать.

1 голос
/ 26 января 2010

К сожалению, если вы не можете гарантировать, что каждая строка в файле имеет одинаковую длину, вам придется прочитать весь файл или, по крайней мере, до строки, которую вы ищете.

Единственный способ подсчитать строки - это найти символы новой строки в файле, а это значит, что вам придется читать каждый байт.

Будет возможно оптимизировать ваш код, чтобы он был аккуратным и читабельным, но под ним вы всегда будете читать весь файл.

Если вы собираетесь читать один и тот же файл снова и снова, вы можете проанализировать файл и создать индекс, хранящий смещения определенных номеров строк, например, количество байтов, в котором находятся строки 100, 200 и т.

1 голос
/ 26 января 2010

Если бы строки, которые вы читали, были все одинаковой длины, тогда вычисление могло бы быть полезным.

Но в ситуации, когда строки имеют различную длину, я не думаю, чтоесть альтернатива читать их по одному, пока количество строк не будет правильным.

0 голосов
/ 12 апреля 2016

Согласно этому ответу , Java 8 позволяет нам извлекать определенные строки из файла. Примеры приведены в этом ответе.

0 голосов
/ 26 января 2010

Если вы собираетесь работать с одним и тем же файлом одинаково (ищите текст в определенной строке), вы можете проиндексировать ваш файл. Номер строки -> смещение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...