10

Как прочитать большой текстовый файл построчно с помощью Java?

19

Я пытаюсь прочитать большой текстовый файл объемом около 5-6 ГБ построчно с помощью Java.

Как я могу сделать это быстро?

5 ответ(ов)

1

Как только Java 8 выйдет (в марте 2014 года), вы сможете использовать потоки (streams) для работы с файлами. Вот пример кода, который считывает строки из файла и обрабатывает их:

try (Stream<String> lines = Files.lines(Paths.get(filename), Charset.defaultCharset())) {
    lines.forEachOrdered(line -> process(line));
}

Если вы хотите просто вывести все строки из файла на экран, вы можете использовать следующий код:

try (Stream<String> lines = Files.lines(file, Charset.defaultCharset())) {
    lines.forEachOrdered(System.out::println);
}

Эти примеры демонстрируют, как удобно работать с файлами с помощью потоков в Java 8.

0

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

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public static void readText() throws FileNotFoundException {
    Scanner scan = new Scanner(new File("samplefilename.txt"));
    while(scan.hasNextLine()){
        String line = scan.nextLine();
        // Здесь вы можете обрабатывать строку так, как вам нужно
    }
}

Класс Scanner позволяет сканировать весь текст. Цикл while используется для перебора всех строк текста.

Метод .hasNextLine() возвращает true, если в тексте остались еще строки. Метод .nextLine() возвращает всю строку в виде String, которую вы можете использовать по своему усмотрению. Например, попробуйте System.out.println(line), чтобы вывести текст на экран.

Примечание: .txt — это текстовый тип файла.

0

Вот пример с полной обработкой ошибок и указанием кодировки для Java до версии 7. В Java 7 вы можете использовать синтаксис try-with-resources, что делает код более чистым.

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

InputStream ins = null; // необработанный поток байтов
Reader r = null; // обработанный reader
BufferedReader br = null; // буферизированный для readLine()
try {
    String s;
    if (true) {
        String data = "#foobar\t1234\n#xyz\t5678\none\ttwo\n";
        ins = new ByteArrayInputStream(data.getBytes());
    } else {
        ins = new FileInputStream("textfile.txt");
    }
    r = new InputStreamReader(ins, "UTF-8"); // пропустите кодировку для значения по умолчанию
    br = new BufferedReader(r);
    while ((s = br.readLine()) != null) {
        System.out.println(s);
    }
} catch (Exception e) {
    System.err.println(e.getMessage()); // обработка исключений
} finally {
    if (br != null) { try { br.close(); } catch(Throwable t) { /* гарантируем закрытие */ } }
    if (r != null) { try { r.close(); } catch(Throwable t) { /* гарантируем закрытие */ } }
    if (ins != null) { try { ins.close(); } catch(Throwable t) { /* гарантируем закрытие */ } }
}

Вот версия на Groovy с полной обработкой ошибок:

File f = new File("textfile.txt");
f.withReader("UTF-8") { br ->
    br.eachLine { line ->
        println line;
    }
}

Этот код демонстрирует, как правильно обрабатывать чтение файлов с учетом ошибок и кодировок в разных версиях Java и Groovy.

0

Файл FileReader не позволяет указать кодировку, поэтому, если вам нужно указать ее, используйте InputStreamReader. Например:

try {
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "Cp1252"));         

    String line;
    while ((line = br.readLine()) != null) {
        // обработка строки
    }
    br.close();

} catch (IOException e) {
    e.printStackTrace();
}

Если вы импортировали этот файл из Windows, он может иметь кодировку ANSI (Cp1252), поэтому вам необходимо явно указать кодировку.

0

В Java 7 вы можете прочитать содержимое текстового файла (например, CSV) с помощью BufferedReader. Ниже приведён пример кода, который демонстрирует, как это сделать:

String folderPath = "C:/folderOfMyFile";
Path path = Paths.get(folderPath, "myFileName.csv"); // или любой другой текстовый файл, например: txt, bat и т.д.
Charset charset = Charset.forName("UTF-8");

try (BufferedReader reader = Files.newBufferedReader(path, charset)) {
  String line;
  while ((line = reader.readLine()) != null) {
    // разделяем все поля CSV на массив строк
    String[] lineVariables = line.split(","); 
    // здесь вы можете обработать lineVariables по мере необходимости
  }
} catch (IOException e) {
    System.err.println(e);
}

Этот код выполняет следующие операции:

  1. Задает путь к папке и имени файла.
  2. Использует класс Files для создания BufferedReader, который читает файл с заданной кодировкой (UTF-8).
  3. В цикле считывает строки, пока не достигнет конца файла (null).
  4. Каждая прочитанная строка разделяется на массив строк с помощью метода split(), где в качестве разделителя используется запятая.
  5. Обработка исключений позволяет отлавливать ошибки, которые могут произойти при чтении файла.

Не забудьте заменить folderPath и myFileName.csv на ваши собственные значения.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь