当前位置: 首页 > 知识库问答 >
问题:

用java编写和附加大文件的最佳方式是什么

公羊子真
2023-03-14

我有一个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使用,并作为实时存档。有没有更好的方法来实现这一点?

共有2个答案

黄沈浪
2023-03-14

根据这个答案,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中可用。

宰父淳
2023-03-14

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的级联性质。例如,如果您知道您的站点将