Как прочитать большой текстовый файл построчно с помощью Java?
Я пытаюсь прочитать большой текстовый файл объемом около 5-6 ГБ построчно с помощью Java.
Как я могу сделать это быстро?
5 ответ(ов)
Как только 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.
Вы можете использовать класс 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
— это текстовый тип файла.
Вот пример с полной обработкой ошибок и указанием кодировки для 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.
Файл 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), поэтому вам необходимо явно указать кодировку.
В 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);
}
Этот код выполняет следующие операции:
- Задает путь к папке и имени файла.
- Использует класс
Files
для созданияBufferedReader
, который читает файл с заданной кодировкой (UTF-8). - В цикле считывает строки, пока не достигнет конца файла (null).
- Каждая прочитанная строка разделяется на массив строк с помощью метода
split()
, где в качестве разделителя используется запятая. - Обработка исключений позволяет отлавливать ошибки, которые могут произойти при чтении файла.
Не забудьте заменить folderPath
и myFileName.csv
на ваши собственные значения.
Как создать строку Java из содержимого файла?
Чтение текстового файла в Java
Как прочитать/конвертировать InputStream в строку в Java?
Как перенаправить вывод в файл и на экран (stdout)
Сканер пропускает nextLine() после использования next() или nextFoo()?