[英]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.