我为我的应用程序中的离线报告编写了一个大约 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();
}
}