Java 扫描仪与InputStreamReader

Java 扫描仪与InputStreamReader,java,file,input,Java,File,Input,有没有人知道下面两种读取输入文件的方法在性能方面是否有任何差异? 谢谢 1) 使用扫描仪和文件读取文件 Scanner input = new Scanner(new File("foo.txt")); 2) 使用InputStreamReader和FileInputStream读取文件 InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt")); 区别在于,我想主要的区别在于,如果需要,使用

有没有人知道下面两种读取输入文件的方法在性能方面是否有任何差异? 谢谢

1) 使用扫描仪和文件读取文件

Scanner input = new Scanner(new File("foo.txt"));
2) 使用InputStreamReader和FileInputStream读取文件

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

区别在于,我想主要的区别在于,如果需要,使用BufferedReader/InputStreamReader,您可以逐个字符地读取整个文档。使用扫描仪,这是不可能的。这意味着使用InputStreamReader,您可以更好地控制文档的内容。;)

就性能而言,至少从我的经验来看,扫描仪肯定是速度较慢的。它用于解析,而不是读取大量数据块。InputStreamReader,具有足够大的缓冲区,可以与BuffReDead阅读器保持一致,我记得它比扫描仪从字典列表中读取的速度要快几倍。记住,BufferedReader比Scanner快几倍

第一点是,这些代码样本中都没有读取文件。这听起来可能愚蠢或不正确,但这是真的。他们实际上做的是打开一个文件进行读取。就他们的实际工作而言,他们各自的效率可能并没有太大的差别

当涉及到实际读取文件时,使用的最佳方法将取决于文件包含的内容、内存算法所需的数据形式等。这将决定使用
扫描仪
还是原始
读取器
,从性能的角度来看,更重要的是从使代码可靠和可维护的角度来看

最后,这很可能不会对代码的总体性能产生重大影响。我想说的是,您过早地优化了应用程序。您最好现在就忽略性能,而选择能使其余代码更简单的版本。当应用程序运行时,使用一些有代表性的输入数据对其进行分析。分析将告诉您读取文件所花费的时间(绝对值)以及相对于应用程序其余部分的时间。这将告诉您是否值得尝试优化文件读取


我给出的唯一一点性能建议是,从无缓冲的输入流或读取器逐字符读取是低效的。如果需要以这种方式读取文件,则应向堆栈中添加一个BufferedReader。

Related:Related:。不过,这个答案并没有解决性能问题,而这正是OP所要求的。@AdamMihalcin如果您的观点是,如果我不同意,那么答案就是。他想了解表演,并了解两者之间的差异,这最终只会有助于他理解两者之间的差异。。