使用Java复制不断增长的文件

时间:2011-11-16 14:54:34

标签: java file copy

我正在尝试弄清楚如何使用Java复制不断增长的文件。我想要工作的一个例子如下:

  1. 从HTTP服务器下载文件。
  2. 我在文件下载完成之前启动文件副本
  3. 复制开始,直到文件完全下载并且所有内容都已复制后才会结束
  4. 我使用了以下代码:

     InputStream is = new FileInputStream(sourceFile);
     OutputStream os = new FileOutputStream(targetFile);
    
     byte[] buf = new byte[8192]; 
     int num;
     while ((num = is.read(buf)) != -1) {
         os.write(buf, 0, num);
     }
    

    但是那只复制到目前为止已经下载的内容,所以我最终得到了一个破碎的目标文件。

    我也使用BufferedInputStream和BufferedOutputStream进行了测试,但这也没有用。

    有没有办法达到我想要的目的?

    由于

2 个答案:

答案 0 :(得分:2)

如果您通过HTTP控制文件下载,那么您可以下载到临时文件,然后在下载完成后重命名该文件,从而使操作成为原子。

另一种方法是让文件复制过程定期检查目标文件的文件大小,并仅在文件大小稳定且不再增加时启动副本。例如,您可以选择每秒记录文件大小,并且只有在3次连续轮询尝试的大小保持不变时才启动副本。

答案 1 :(得分:2)

这将是棘手的,因为复制过程没有可靠的方式知道下载何时完成。您可以查看文件是否在增长,但下载可能会停止一段时间,您可能会错误地断定它已完成。如果下载失败,您也无法知道您正在查看不完整的文件。

我认为最好的选择是下载过程。如果您控制它,您可以修改它以将文件存储在其他位置或两个位置,或者根据您的要求在末尾移动/重命名。

如果您不控制下载过程,并且这是一个简单的HTTP下载,您可以用您控制的内容替换它。