java - 使用 NIO 写入一个大文本文件

标签 java io nio filechannel

我在应用程序中编写了一个大约 1200 (+/- 200) mb 的大型 csv 文件作为离线报告。 (一个线程执行此作业。)数据计数可能约为 5000 万,因此每 50k 行运行一次查询。查询循环运行直到空获取(对于给定的条件)。为了将数据写入文件,我没有使用 Java 流,而是尝试了 nio。我花了大约 12 秒写了一个 50000 行的巨大字符串。使用 BufferedWriter 尝试相同的代码大约需要 18-22 秒。 nio方法代码如下。我想知道这是否是使用 nio 编写大文件的直接方法?有什么是我忽略、错过的吗?任何其他方式,欢迎优化和代码改进。

private static void writeData(FileChannel channel, String data) {
    ByteBuffer buffer = null;
    try {
        buffer = Charset.forName("UTF-8").encode(
                CharBuffer.wrap(data.toCharArray()));
        channel.write(buffer);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private String writeReport() {
    try {
        FileOutputStream out = new FileOutputStream(pathToFile, true);
        FileChannel channel = out.getChannel();
        // db query
        while(iterate resultset) {
             // get row result
            writeData(channel, data);
        }
    } catch(Exception e){
      //log
    } finally {
      channel.close();
      out .close();
    }
}

//pseudo code with bufferedwriter
private String writeReport(Resultset rs, String file) {
    try {
        BufferedWriter writer = new BufferedWriter(new FileWriter(file), 1024 * 10);
        int headerCount = 0;
        while(rs.next()) {
            String col1 = rs.getString(1);
            String col2 = rs.getString(2);
            String col3 = rs.getString(3);
            String col4 = rs.getString(4);
            String col5 = rs.getString(5);
            String colN= rs.getString(n); //nth column
            if(headerCount==0) {
                writeHeader(writer);
                headerCount++;
            }
            if(col1.equals(condition1)) {
                 writer.append(col1).append(",");
            }
            ......
            if(colN.equals(conditionN)) {
                 writer.append(colN).append(",").append(newLine());
            }
        }
    } catch(Exception e){
      //log
    } finally {
      writer.close();
    }
}

最佳答案

写入文件的最快方法可能是使用BufferedWriter。如果那很慢,我想看看你的代码。不应期望 NIO 在这里提供任何令人惊讶的内容,并且您发布的代码肯定不会比 BufferedWriter 更快,因为它将执行更多的物理写入。

关于java - 使用 NIO 写入一个大文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20491630/

相关文章:

java - 如何修复 "android.view.InflateException: Binary XML file line #23: Binary XML file line #23: Error inflating class fragment"

java - 我的 servlet 类不是从 ECLIPSE IDE 中的 tomcat 服务器实例化的

java - 添加 GWT 可视化库?

Haskell IO 递归

java - 失败的 "retrying"逻辑的设计模式?

java - 在 SocketChannel 上通过 TCP 读取未定义字节数的流

java - 是否存在从外部文件恢复属性的递归 Ant 任务?

c++ - 将 unsigned int 转换为字节数组并返回

Java NIO SelectionKey 迭代器和键处理,我做得对吗?

java - 如何在Java 7中使用NIO和JFilechooser?