有谁碰巧知道下面两种读取输入文件的方法在性能方面是否有任何区别?谢谢。
1) 使用 Scanner 和 File 读取文件
Scanner input = new Scanner(new File("foo.txt"));
2) 使用 InputStreamReader 和 FileInputStream 读取文件
InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt"));
第一点是这些代码示例都没有读取文件。这听起来可能很愚蠢或不正确,但这是真的。他们实际上做的是打开一个文件进行阅读。就他们实际所做的而言,他们各自的效率可能没有太大差异。
在实际读取文件时,使用的最佳方法将取决于文件包含的内容、内存中算法的数据必须采用何种形式等。这将决定使用它还是更好Scanner
用raw Reader
,从性能的角度来看,更重要的是从使您的代码可靠和可维护的角度来看。
最后,这可能不会对代码的整体性能产生重大影响。我的意思是你过早地优化了你的应用程序。您最好暂时忽略性能并选择使其余代码更简单的版本。当应用程序工作时,使用一些代表性的输入数据对其进行分析。分析将告诉您读取文件所花费的时间,绝对值,以及相对于应用程序其余部分的时间。这将告诉您尝试优化文件读取是否值得。
我要给出的唯一一点性能建议是从无缓冲的输入流或读取器中逐个字符地读取效率低下。如果需要以这种方式读取文件,则应将 BufferedReader 添加到堆栈中。
一个区别,我猜,主要是使用 BufferedReader/InputStreamReader,如果你愿意,你可以逐个字符地读取整个文档。使用扫描仪,这是不可能的。这意味着使用 InputStreamReader 您可以更好地控制文档的内容。;)
就性能而言,Scanner 绝对是最慢的,至少从我的经验来看是这样。它是为解析而不是读取大量数据而设计的。InputStreamReader 具有足够大的缓冲区,可以与 BufferedReader 媲美,我记得它从字典列表中读取比 Scanner 快几倍。这是 BufferedReader 和 InputStreamReader 之间的比较。请记住,BufferedReader 比 Scanner 快几倍。