Scanner vs InputStreamReader

2022-09-04 02:43:14

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

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

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

2) 使用 InputStreamReader 和 FileInputStream 读取文件

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

答案 1

第一点是,这个代码示例都不能读取文件。这可能听起来很荒谬或不正确,但这是事实。他们实际做的是打开一个文件进行读取。就他们实际做的事情而言,他们各自的效率可能没有太大的区别。

在实际读取文件时,使用的最佳方法将取决于文件包含的内容,内存中算法的数据必须采用何种形式等。这将决定它是更好的使用还是原始的,从性能的角度来看,更重要的是从使代码可靠和可维护的角度来看。ScannerReader

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

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


答案 2

就性能而言,扫描仪绝对是较慢的,至少从我的经验来看是这样。它是为解析而制作的,而不是读取大量数据。InputStreamReader具有足够大的缓冲区,可以与BufferedReader相当,我记得从字典列表中读取Scansprint快几倍。以下是 BufferedReader 和 InputStreamReader 之间的比较。请记住,BufferedReader比Scansler快几倍。