【发布时间】:2012-05-03 10:25:04
【问题描述】:
在我看到的从文件读取的每个 Java 实现中,我几乎总是看到一个文件读取器用于逐行读取。我的想法是,这将非常低效,因为它需要每行一个系统调用。
我一直在做的是使用输入流并直接获取字节。在我的实验中,这明显更快。我的测试是一个 1MB 的文件。
//Stream method
try {
Long startTime = new Date().getTime();
InputStream is = new FileInputStream("test");
byte[] b = new byte[is.available()];
is.read(b);
String text = new String(b);
//System.out.println(text);
Long endTime = new Date().getTime();
System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));
}
catch (Exception e) {
e.printStackTrace();
}
//Reader method
try {
Long startTime = new Date().getTime();
BufferedReader br = new BufferedReader(new FileReader("test"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
String text = sb.toString();
Long endTime = new Date().getTime();
System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));
}
catch (Exception e) {
e.printStackTrace();
}
这给出了以下结果:
Text length: 1054631, Total time: 9
Text length: 1034099, Total time: 22
那么,为什么人们使用阅读器而不是流?
如果我有一个方法可以获取一个文本文件并返回一个包含所有文本的字符串,那么使用流是否一定更好?
【问题讨论】:
-
您的代码不正确。不保证会读取整个文件,请参阅 read 和 available 方法的文档。
-
你试过java.nio.File包的Files.readAllLines(...)方法吗?
-
+1 表示学到了新东西
标签: java text inputstream