我有一个java程序,它向Web服务发送一系列GET请求,并将响应体存储为文本文件。
我已经实现了下面的示例代码(过滤了大部分代码以突出显示相关内容),它附加了文本文件,并在EOF处作为新行写入。然而,代码工作得很好,但随着文件的大小变大,性能会受到影响。
数据的总大小几乎为4GB,并在avg上附加大约500KB到1MB的数据。
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使用,并作为实时存档。有没有更好的方法来实现这一点?
根据这个答案,FileWriter和BufferedWriter之间的Java差异——您现在所做的是低效的。
您提供的代码不完整。括号缺失,作者没有close
语句。但是,如果我对每个resultData
都理解正确,就可以打开一个新的缓冲写入程序,并调用write一次。这意味着您应该直接使用FileWriter
,因为这样做,缓冲区只是一种开销。
如果您希望它在循环中获取数据并将其写入单个文件,那么您应该执行以下操作
try( BufferedWriter writer = new BufferedWriter(new FileWriter("PATH_HERE", true)) ) {
String resultData = "";
do {
//send the GET request & fetch data as string
resultData = HTTP.GET <uri>;
//write or append the file
writer.write(resultData + "\n");
} while(resultData != null && !resultData.isEmpty());
} catch(Exception e) {
e.printStackTrace();
}
上面使用的是try with资源,它将在退出try
块后关闭writer。这在Java7中可用。
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 Web服务调用,性能也取决于webservice
的响应
时间。
问题内容: 别人的过程是通过在事件发生时一次向其添加一行来创建CSV文件。我无法控制文件格式或其他过程,但我知道它只会追加。 在Java程序中,我想监视此文件,并在添加一行后读取新行并根据内容做出反应。现在忽略CSV解析问题。监视文件的更改并一次读取一行的最佳方法是什么? 理想情况下,这将使用标准库类。该文件很可能位于网络驱动器上,所以我想提供一些可以防止故障的文件。如果可能,我宁愿不使用轮询-我
问题内容: 我想知道用Java编写文本文件最简单(最简单)的方法是什么。请保持简单,因为我是初学者:D 我在网上搜索并找到了此代码,但我了解其中的50%。 } 问题答案: 在Java 7及更高版本中,一个使用Files的衬板:
问题内容: 我有一个不完整的csv文件,需要准确更新,因此有这样的csv文件: 自然地,文件要复杂得多,但是以这种格式,这是我要在7到8(或任何范围)之间插入或n个单词的内容。我怎样才能做到这一点? 伪代码,代码或示例都很好,我不知道如何开始。 更新: 也许我应该将其转换为数组或某种数据结构。然后,在特定位置插入新项目,将其余内容右移,并在每次插入时执行该操作。 我不知道是否正确的方法或如何开始对
问题内容: 我有一个程序,可以执行大量计算并经常将其报告到文件中。我知道频繁的写入操作会大大降低程序的速度,因此,为了避免出现这种情况,我希望有一个专门用于写入操作的线程。 现在,我正在用我写的这堂课(不耐烦的可以跳到问题的结尾): 然后我通过以下方式使用它: 尽管此方法运行良好,但我想知道: 是否有更好的方法来实现这一目标? 问题答案: 您的基本方法看起来不错。我将代码结构如下: 如果你不希望在
问题内容: 如何批量反编译许多类文件? 问题答案: JD-Gui使您的生活变得轻松,它还具有一个eclipse插件 编辑:更新了该工具的最新网址
问题内容: 在处理大型和/或许多Javascript和CSS文件时,减小文件大小的最佳方法是什么? 问题答案: 除了使用服务器端压缩外,使用智能编码是保持较低带宽成本的最佳方法。您始终可以使用Dean Edward的Javascript Packer之类的工具,但是对于CSS,请花一些时间学习CSS Shorthand。例如使用: …代替: 另外,请使用CSS的级联性质。例如,如果您知道您的站点将