Scanner与InputStreamReader的区别

14

有没有人知道使用以下两种读取输入文件的方法性能上是否有差异?谢谢。

1)使用Scanner和File读取文件

Scanner input = new Scanner(new File("foo.txt"));

2) 使用InputStreamReader和FileInputStream读取文件

InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt"));

1
相关:https://dev59.com/j3E95IYBdhLWcg3wn_Rr - Paul Bellora
相关链接:Scanner v. StreamTokenizer - trashgod
3个回答

9
第一点是这两个代码示例都没有读取文件。这可能听起来很愚蠢或不正确,但事实如此。它们实际上是为了读取而打开文件。就它们实际执行的操作而言,在效率方面它们之间可能没有太大的区别。
当涉及到真正读取文件时,最好的方法取决于文件包含什么内容,数据必须以什么形式呈现给内存算法等。这将决定从性能和更重要的可靠性和可维护性的角度来看,是使用Scanner还是原始Reader更好。
最后,这对你的代码整体性能的影响可能不会很大。我的意思是你正在过早地优化你的应用程序。你最好暂时忽略性能,选择使你的其余代码更简单的版本。当应用程序运行时,使用一些代表性输入数据对其进行分析。分析将告诉您花费在读取文件上的时间,绝对值和相对于应用程序的其他部分。这将告诉您是否值得尝试优化文件读取。
我唯一的性能建议是,从未缓冲的输入流或读取器中逐个字符读取是低效的。如果需要那样读取文件,则应将BufferedReader添加到堆栈中。

4

我猜区别在于使用 BufferedReader/InputStreamReader 可以逐个字符地读取整个文档。而使用 Scanner 则不行。这意味着使用 InputStreamReader 可以更好地控制文档内容。 ;)


3
这个回答没有涉及性能方面,然而这正是提问者所询问的。 - Adam Mihalcin
2
如果你的观点是这个答案离题了,我不同意。他想了解性能,并且知道两者之间的区别,这最终只会有益于他对两者之间差异的理解。 - Joop

4
就性能而言,从我的经验来看,Scanner肯定更慢。它是专门用于解析而不是读取大块数据的。InputStreamReader通过足够大的缓冲区可以与BufferedReader表现相当,并且我记得在读取字典列表时比Scanner快几倍。这里是BufferedReader和InputStreamReader的比较。请记住,BufferedReader比Scanner快几倍。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接