我需要使用Java逐行读取一个大约5-6 GB的大文本文件。
我怎样才能快速完成这项工作?
发布于 2013-07-26 02:58:39
一旦Java 8发布(2014年3月),您将能够使用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);
}
发布于 2013-03-27 12:24:44
下面是一个完整的错误处理示例,并支持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;
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 */ } }
}
下面是Groovy版本,包含完整的错误处理:
File f = new File("textfile.txt");
f.withReader("UTF-8") { br ->
br.eachLine { line ->
println line;
}
}
发布于 2018-04-08 08:10:00
我记录并测试了10 different ways to read a file in Java,然后通过让它们读取从1KB到1 1GB的测试文件来对它们进行比较。以下是读取1 1GB测试文件的最快的3种文件读取方法。
请注意,在运行性能测试时,我没有向控制台输出任何内容,因为这会真正减慢测试速度。我只是想测试一下原始的阅读速度。
1) java.nio.file.Files.readAllBytes()
在Java 7、8、9中测试。总的来说,这是最快的方法。读取1 1GB文件的时间始终不到1秒。
import java.io..File;
import java.io.IOException;
import java.nio.file.Files;
public class ReadFile_Files_ReadAllBytes {
public static void main(String [] pArgs) throws IOException {
String fileName = "c:\\temp\\sample-1GB.txt";
File file = new File(fileName);
byte [] fileBytes = Files.readAllBytes(file.toPath());
char singleChar;
for(byte b : fileBytes) {
singleChar = (char) b;
System.out.print(singleChar);
}
}
}
2) java.nio.file.Files.lines()
这在Java 8和9中测试成功,但由于缺乏对lambda表达式的支持,它在Java 7中不起作用。读取一个1 1GB的文件大约需要3.5秒,这使得它在读取更大的文件时排在第二位。
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.stream.Stream;
public class ReadFile_Files_Lines {
public static void main(String[] pArgs) throws IOException {
String fileName = "c:\\temp\\sample-1GB.txt";
File file = new File(fileName);
try (Stream linesStream = Files.lines(file.toPath())) {
linesStream.forEach(line -> {
System.out.println(line);
});
}
}
}
3) BufferedReader
测试可以在Java 7、8、9下运行。读取一个1 1GB的测试文件大约需要4.5秒。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile_BufferedReader_ReadLine {
public static void main(String [] args) throws IOException {
String fileName = "c:\\temp\\sample-1GB.txt";
FileReader fileReader = new FileReader(fileName);
try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {
String line;
while((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
}
你可以找到所有10种文件读取方法here的完整排名。
https://stackoverflow.com/questions/5868369
复制相似问题