我有一个 java 程序,它向网络服务发送一系列 GET 请求并将响应正文存储为文本文件。
我已经实现了以下示例代码(过滤了大部分代码以突出显示相关内容),它附加了文本文件并在 EOF 处作为新行写入。然而,该代码可以完美运行,但随着文件大小的增加,性能会受到影响。
数据的总大小将近 4 GB,并且平均附加大约 500 KB 到 1 MB 的数据。
do
{
//send the GET request & fetch data as string
String resultData = HTTP.GET <uri>;
// buffered writer to create a file
BufferedWriter writer = new BufferedWriter(new FileWriter(path, true));
//write or append the file
writer.write(resultData + "\n");
}
while(resultData.exists());
这些文件每天创建并移动到 hdfs 以供 hadoop 使用和作为实时存档。有没有更好的方法来实现这一点?
最佳答案
1) 您每次都打开一个新的writer
,而没有关闭之前的writer
对象。
2)不要每次写操作都打开文件,而是在循环前打开,循环后关闭。
BufferedWriter writer = new BufferedWriter(new FileWriter(path, true));
do{
String resultData = HTTP.GET <uri>;
writer.write(resultData + "\n");
}while(resultData.exists());
writer.close();
3) BufferedWriter
的默认缓冲大小是 8192 个字符,因为你有 4 GB 的数据,我会增加缓冲区大小,以提高性能,但同时确保你的 JVM 有足够的内存来保存数据。
BufferedWriter writer = new BufferedWriter(new FileWriter(path, true), 8192 * 4);
do{
String resultData = HTTP.GET <uri>;
writer.write(resultData + "\n");
}while(resultData.exists());
writer.close();
4) 由于您正在调用 GET 网络服务,因此性能还取决于 webservice
的响应
时间。
关于java - 在 Java 中编写和追加大文件的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30398924/