Вопрос-ответ

How can I read a large text file line by line using Java?

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

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

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

Переведено автоматически
Ответ 1

Распространенный шаблон заключается в использовании

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null) {
// process the line.
}
}

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

РЕДАКТИРОВАТЬ: менее распространенный шаблон для использования, который позволяет избежать line утечки.

try(BufferedReader br = new BufferedReader(new FileReader(file))) {
for(String line; (line = br.readLine()) != null; ) {
// process the line.
}
// line is not visible here.
}

ОБНОВЛЕНИЕ: в Java 8 вы можете сделать

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
stream.forEach(System.out::println);
}

ПРИМЕЧАНИЕ: Вы должны поместить поток в блок try-with-resource, чтобы убедиться, что для него вызван метод #close , в противном случае дескриптор базового файла никогда не закрывается, пока GC не сделает это намного позже.

Ответ 2

Посмотрите этот блог:


Размер буфера может быть указан или может использоваться размер по умолчанию. Значение по умолчанию достаточно велико для большинства целей.


// Open the file
FileInputStream fstream = new FileInputStream("textfile.txt");

// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

String strLine;

//Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
System.out.println (strLine);
}

//Close the input stream
in.close();
Ответ 3

После выхода 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);
}
Ответ 4

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

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

InputStream ins = null; // raw byte-stream
Reader r = null; // cooked reader
BufferedReader br = null; // buffered for 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"); // leave charset out for default
br = new BufferedReader(r);
while ((s = br.readLine()) != null) {
System.out.println(s);
}
}
catch (Exception e)
{
System.err.println(e.getMessage()); // handle exception
}
finally {
if (br != null) { try { br.close(); } catch(Throwable t) { /* ensure close happens */ } }
if (r != null) { try { r.close(); } catch(Throwable t) { /* ensure close happens */ } }
if (ins != null) { try { ins.close(); } catch(Throwable t) { /* ensure close happens */ } }
}

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

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