我正在尝试弄清楚如何使用Java复制不断增长的文件。我想要工作的一个例子如下:
我使用了以下代码:
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进行了测试,但这也没有用。
有没有办法达到我想要的目的?
由于
答案 0 :(得分:2)
如果您通过HTTP控制文件下载,那么您可以下载到临时文件,然后在下载完成后重命名该文件,从而使操作成为原子。
另一种方法是让文件复制过程定期检查目标文件的文件大小,并仅在文件大小稳定且不再增加时启动副本。例如,您可以选择每秒记录文件大小,并且只有在3次连续轮询尝试的大小保持不变时才启动副本。
答案 1 :(得分:2)
这将是棘手的,因为复制过程没有可靠的方式知道下载何时完成。您可以查看文件是否在增长,但下载可能会停止一段时间,您可能会错误地断定它已完成。如果下载失败,您也无法知道您正在查看不完整的文件。
我认为最好的选择是下载过程。如果您控制它,您可以修改它以将文件存储在其他位置或两个位置,或者根据您的要求在末尾移动/重命名。
如果您不控制下载过程,并且这是一个简单的HTTP下载,您可以用您控制的内容替换它。