java - BufferedWriter 性能缓慢

标签 java file csv io bufferedwriter

我有一种方法可以将 44 MB 的数据从 ResultSet 写入 CSV 文件。然而,完成大约需要 3.5 分钟。对于只有 44 MB 的数据来说,这似乎很慢。任何人都可以看到任何减慢我的代码速度的东西吗?:

public static void convertToCSV(final ResultSet rs) throws SQLException, IOException {
    final BufferedWriter fw = new BufferedWriter(new FileWriter(new File("alert.csv")));
    while (rs.next()) {
        fw.write(rs.getString("FIELD1")+",");
        fw.write(rs.getString("FIELD2")+",");
        fw.write(rs.getString("FIELD3")+",");
        final String clobValue = rs.getString("FIELD4");
        if(clobValue==null)
            fw.write("null,");
        else{
            fw.write("\""+clobValue+"\",");
        }
        final Date date = new Date(rs.getLong("FIELD5"));
        final DateFormat format = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        final String dateTime[] = format.format(date).split(" ");
        fw.write(dateTime[0]+",");
        fw.write(dateTime[1]);

        fw.write("\n");
    }
    fw.close();
}

最佳答案

这样的事情可能会更快

public static void convertToCSV(final ResultSet rs) throws SQLException, IOException {
    final BufferedWriter fw = new BufferedWriter(new FileWriter(new File("alert.csv")));
    final DateFormat format = new SimpleDateFormat("'yyyyMMdd','HH:mm:ss'");
    format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

    while (rs.next()) {
      StringBuilder sb = new StringBuilder();
      sb.append(rs.getString("FIELD1")).append(',')
        .append(rs.getString("FIELD2")).append(',')
        .append(rs.getString("FIELD3")).append(',');

        final String clobValue = rs.getString("FIELD4");
        if(clobValue==null)
          sb.append("null,");            
        else{
          sb.append('\"').append(clobValue).append('\"').append(',');
        }
        Date date = new Date(rs.getLong("FIELD5"));
        sb.append(format.format(date)).append('\n');
        fw.write(sb.toString());
    }
    fw.close();
}
  1. DateFormat 的创建仅在循环之外完成一次。
  2. 使用StringBuilder
  3. 尽可能避免创建临时对象。

您甚至可以重用StringBuilder,方法是将创建的内容移出循环,并在编写它后执行setLength(0)

关于java - BufferedWriter 性能缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33238704/

相关文章:

android - 如何在微调器中设置位置?

sql - 将序列值重置为 1

r - 如何通过合并 csv 文件创建数据框,然后基于它创建 Shiny 的应用程序?

java - 单击命令按钮时获取 NULL 值

Java正则表达式匹配

java - 使用抽象类和接口(interface)的设计问题

java - 在哪里可以定义 java 编译器选项,以便计算机上运行的任何 java 进程都可以看到它们?

C 文件看不到包含文件中声明的变量

iphone - iOS递归文件夹大小

javascript - 如何在D3.js中的svg上显示直线?