簡體   English   中英

用NIO寫一個大文本文件

[英]Write a large text file with NIO

我在應用程序中為脫機報告編寫了一個大的,大約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,更快BufferedWriter,因為它將執行更多的物理寫入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM