0

我正在编写下面的代码,该代码基本上通过缓冲写入器写入文件,我使用的是 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());
 }
4

3 回答 3

1

我会检查java.nio包裹。这个SO问题/答案详细说明了更多信息。性能增加。

我对较大文件大小的经验是 java.nio 比 java.io 快。确实更快。就像在 >250% 的范围内一样。

于 2013-08-16T14:56:38.177 回答
1

这应该至少是内存效率的。博客: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());
    }
于 2013-08-16T15:08:14.020 回答
0

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

于 2013-08-16T15:04:06.907 回答