【问题标题】:Scanner vs InputStreamReader扫描仪与 InputStreamReader
【发布时间】:2012-04-21 11:41:19
【问题描述】:

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

1) 使用 Scanner 和 File 读取文件

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

2) 使用 InputStreamReader 和 FileInputStream 读取文件

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

【问题讨论】:

标签: java file input


【解决方案1】:

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

【讨论】:

  • 不过,这个答案并没有解决性能问题,这正是 OP 所要求的。
  • @AdamMihalcin 如果您的观点是题外话,我不同意。他想听听性能,也想知道两者之间的区别,这最终只会有助于他理解两者之间的区别..
【解决方案2】:

就性能而言,Scanner 绝对是速度较慢的一种,至少从我的经验来看是这样。它是为解析而不是读取大量数据而设计的。 InputStreamReader 具有足够大的缓冲区,可以与 BufferedReader 媲美,我记得它从字典列表中读取比 Scanner 快几倍。 Here's a comparison between BufferedReader and InputStreamReader。请记住,BufferedReader 比 Scanner 快几倍。

【讨论】:

    【解决方案3】:

    第一点是这些代码示例都没有读取文件。这听起来可能很愚蠢或不正确,但这是真的。他们实际上做的是打开一个文件进行阅读。而且就他们实际所做的而言,他们各自的效率可能没有太大差异。

    在实际读取文件时,使用的最佳方法取决于文件包含的内容、内存中算法的数据格式等。这将决定是否更好使用Scanner 或原始Reader,从性能角度来看,更重要的是从使您的代码可靠和可维护的角度来看。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2017-04-27
      • 2017-02-12
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      相关资源
      最近更新 更多