使文件编写过程更快

时间:2013-08-16 14:53:52

标签: java performance

我正在编写下面的代码,这段代码基本上是通过缓冲编写器写入文件,我使用的是JDK 1.5,现在我的查询基本上这段代码工作正常并写入文件,文件很大就说了文件的最终大小约为1GB,现在请允许我在JDK 1.5中提供Java提供的任何其他替代方案,这可以使文件编写过程更快,并提高性能吗?

 File file = new File(FilePath + getFileName());
 try (BufferedWriter bw = new  BufferedWriter(new FileWriter(file))) {
   for (Posuser posuser : totalusers) {
     for (potook bk : books) {
       if ((posuser.getUpdatedBy() == null)
           && (posuser.getUpdateddateformat() == null)) {
         bw.write("aaa"+"\r\n");
       } else if (posuser.getUpdatedBy() == null
                  && posuser.getUpdateddateformat() != null) {
         bw.write("bbb+"\r\n");
       } else if (posuser.getUpdatedBy() != null
                  && posuser.getUpdateddateformat() == null) {
         bw.write("ccc"+"\r\n");
       } else {
         bw.write("ddd"+\r\n");
       }
     }
   }
 } catch (IOException, AnotherException e) {
   logger.error(e.getMessage());
 }

3 个答案:

答案 0 :(得分:1)

我会查看java.nio包。 This SO question/answer详细了解更多信息。性能提升。

  

我对较大文件大小的体验是java.nio更快   比java.io.坚固得快。比如在> 250%范围内。

答案 1 :(得分:1)

这应该至少是内存效率。 Blog: String intern字符串+操作费用很高,您应该使用StringBuilder代替。

   final String aaaString = "aaa".intern();
    final String bbbString = "bbb".intern();
    final String cccString = "ccc".intern();
    final String dddString = "ddd".intern();
    final String EOL = "\r\n".intern();

    File file = new File(FilePath + getFileName());
    try (BufferedWriter bw = new  BufferedWriter(new FileWriter(file))) {
      for (Posuser posuser : totalusers) {
        for (potook bk : books) {
          if ((posuser.getUpdatedBy() == null)
              && (posuser.getUpdateddateformat() == null)) {
            bw.write(aaaString);
            bw.write(EOL);
          } else if (posuser.getUpdatedBy() == null
                     && posuser.getUpdateddateformat() != null) {
            bw.write(bbbString);
            bw.write(EOL);
          } else if (posuser.getUpdatedBy() != null
                     && posuser.getUpdateddateformat() == null) {
            bw.write(cccString);
            bw.write(EOL);
          } else {
            bw.write(dddString);
            bw.write(EOL);
          }
        }
      }
    } catch (IOException, AnotherException e) {
      logger.error(e.getMessage());
    }

答案 2 :(得分:0)

仅使用BufferedWriter是不够的,您需要调整缓冲区大小(第二个构造函数参数)。缓冲区越大,性能就越高。但请记住,如果将缓冲区大小设置为1MB,则需要确保为此代码的每个并发调用保留1MB RAM不是问题。另外,Brian的回答(java.nio包)非常好。将两者结合起来:更改为java.nio并调整缓冲区大小,直到找到用例的幻数。