【问题标题】:Is there a pattern for re-using a BufferedWriter?是否有重复使用 BufferedWriter 的模式?
【发布时间】:2011-11-09 03:37:30
【问题描述】:

我正在从一个目录(包含数千个文件)读取 XML 文件,处理内容并为每个输入文件编写一个输出文件。有没有办法“重新指向”现有的 BufferedWriter 而不是为每个文件创建一个新实例?

...
    Scanner scanner;
    BufferedWriter writer;
    File outfile;
    for (File f: directory.ListFiles[]){
      scanner = new Scanner(f);
      outfile = ...;
      // processing input
      writer = new BufferedWriter(new FileWriter(new File(outfile)));
      // write the content
      writer.flush();
      writer.close();
    }

...

必须创建 ScannerBufferedWriter 的数千次迭代似乎是一种浪费。

【问题讨论】:

  • JVM 可以检测它是否可以重用创建的写入器对象...
  • 对象创建非常便宜,因此无需担心创建对象
  • BufferedWriter 是一个非常轻量级的类。比它包装的文件轻得多。
  • 更大的问题是您没有指定用于写入文件的编码。你知道你的默认编码是什么吗?您能保证您文件的每个使用者都具有相同的编码吗?如果这两个问题的答案是“否”,那么您应该使用带有显式编码的OutputStreamWriter
  • @a_horse_with_no_name,我正在分析我的 android 应用程序的性能,而 BufferedWriter 分配(或者更确切地说,在其构造函数中完成的 char[] 分配)是目前昂贵的 GC_FOR_ALLOC 传递的最大贡献者,而且非常破坏了我的用户界面。分配速度挺快的,但是对系统的影响很大。

标签: java reusability bufferedwriter


【解决方案1】:

对我来说,这听起来像是过早的优化。 JVM 是地球上最智能的软件之一,它可以检测您的对象是否是短暂的。它可以(也将)执行大量优化。您尝试进行的任何微优化很可能只会导致性能下降。

性能优化的关键是衡量,而不是推理。

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多