2010-04-26 7 views
2

У меня есть текстовый файл. Я хотел бы получить содержимое из одной строки в другую. Например, файл может быть 200K строк. Я хочу прочитать содержимое из строки 78 до строки 2735. Поскольку файл может быть очень большим, я не хочу читать весь контент в памяти.Прочитать текстовый файл в Java

ответ

0

Вот начало возможного решения:

public static List<String> linesFromTo(int from, int to, String fileName) 
     throws FileNotFoundException, IllegalArgumentException { 
    return linesFromTo(from, to, fileName, "UTF-8"); 
} 

public static List<String> linesFromTo(int from, int to, String fileName, String charsetName) 
     throws FileNotFoundException, IllegalArgumentException { 

    if(from > to) { 
     throw new IllegalArgumentException("'from' > 'to'"); 
    } 
    if(from < 1 || to < 1) { 
     throw new IllegalArgumentException("'from' or 'to' is negative"); 
    } 

    List<String> lines = new ArrayList<String>(); 
    Scanner scan = new Scanner(new File(fileName), charsetName); 
    int lineNumber = 0; 

    while(scan.hasNextLine() && lineNumber < to) { 
     lineNumber++; 
     String line = scan.nextLine(); 
     if(lineNumber < from) continue; 
     lines.add(line); 
    } 

    if(lineNumber != to) { 
     throw new IllegalArgumentException(fileName+" does not have "+to+" lines"); 
    } 

    return lines; 
} 
+0

Замените '// take' на' assert' и добавьте ';' в конец ;-) –

+0

Кроме того, есть ли причина использовать сканер вместо (возможно) более простого 'BufferedReader'? Кроме того: вы не указываете использование кодировки символов для чтения из файла, поэтому вы оставляете эту часть на удачу. –

+0

@Joachim, хорошие моменты, я отредактировал мой ответ! Что касается «BufferedReader», я предполагаю, что (d) это не имеет большого значения: я ошибаюсь? –

0

Просто прочитайте сначала строку за строкой и подсчитайте номера строк и начните получать содержимое, которое вам нужно, в указанной вами позиции.

11

Используйте BufferedReader.readLine() и подсчитайте линии. Вы сохраните только размер буфера и текущую строку в памяти.

И нет, невозможно добраться до строки 3412 без прочтения всего файла до этой точки (если только ваши строки не имеют фиксированного размера).

0

Я хотел бы предложить использовать RandomAccessFile, этот класс позволяет перейти к определенному местоположению в файле. Поэтому, если вы хотите прочитать последнюю строку файла, вам не нужно читать все предыдущие строки, вы можете просто перейти к этой строке.

+1

Это не помогает, поскольку между байтовым индексом и номерами строк не существует фиксированной связи. Строка может быть такой же длинной или короткой, как вам угодно, поэтому вам нужно будет прочитать данные, чтобы знать, когда они заканчиваются. Чтение последней строки может быть улучшено таким образом (если файл фактически не содержит одну огромную линию), но в целом это не поможет. –

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