我目前使用:
BufferedReader input = new BufferedReader(new FileReader("filename"));
有更快的方法吗?
虽然你所使用的方法可能不是绝对最快的,但它很简单。实际上,我不会使用那种形式 - 我会使用一些允许我指定字符集的东西,例如:
// Why is there no method to give this guaranteed charset
// without "risk" of exceptions? Grr.
Charset utf8 = Charset.forName("UTF-8");
BufferedReader input = new BufferedReader(
new InputStreamReader(
new FileInputStream("filename"),
utf8));
你可能可以使用NIO使它运行更快,但在看到实际问题之前我不会这样做。如果你发现有问题,但同时又在对数据进行其他操作,请确保它们不是问题的原因:编写一个程序仅读取文件的文本内容。不要忘记在运行之间清除文件系统缓存所需的任何操作...
new Scanner(new File(...))
? - Simon KuangScanner
有多少缓冲区,而且个人非常讨厌Scanner
API。如果你只需要读取文本行,那么使用它就是巨大的浪费——而我给出的每一行代码都是为了做一件事情。 - Jon SkeetReader
传递给任何其他只对文本感兴趣的代码。例如,我可以从Reader
加载Properties
数据,但不能从Scanner
中加载。我可以使用Reader
解析XML,但不能使用Scanner
。 - Jon SkeetScanner
时传入编码。不幸的是,Scanner
不允许您传递Charset
,只能传递名称...而InputStreamReader
允许您指定Charset
,所以我可以使用例如Java 7的StandardCharsets.UTF_8
... - Jon Skeetjava.nio.channels.FileChannel.map(MapMode.READ_ONLY, ...)
,但这种方法在释放内存方面存在严重问题。File file = new File("querySourceFileName");
Scanner s = new Scanner(file);
while (s.hasNext()) {
System.out.println(s.nextLine());
}
你有对其他选项进行性能测试吗?我想象在某些情况下,不使用 BufferedReader 可能会更快 - 比如处理非常小的文件。我建议你至少进行一些小型的性能测试,并找到适用于你典型使用场景的最快实现。
这取决于您想要阅读什么。完整的文件还是从特定位置开始,您需要能够搜索它,还是想一次性阅读完整的文本?