2010-01-26 4 views
21

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

String readLine(File file, int lineNumber) 

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

ответ

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

+0

Что такое FileUtils? Это из Java 7? – finnw

+0

нет, это общая площадь - библиотека, указанная в вопросе – Bozho

+1

Эффективность? Я думаю, что реальная проблема в том, что первое решение читает ** весь ** файл в память ... – abyx

1

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

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

+0

И «такая же длина» означает такую ​​же длину в байтах, а не в символах (с кодировкой символов переменной длины) – MBO

+0

Фактически входной файл имеет фиксированную длину и ANSI, я забываю указать это в вопросе. Проблема может быть разделителем строк, приложение должно запускаться как в Windows, так и в Unix. –

0

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

5

Не об этом я знаю.

Имейте в виде, что нет никакой особой индексации на файлы, чтобы там, где начинается линия, так что любой метод утилита будет точно так эффективен, как:

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

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

1

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

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

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

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

1

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

1

guava есть что-то подобное:

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

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

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

Использование Utils Файл:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^