FileUtils.copyFile在处理大文件时出现错误

6

我有一个简单的Java应用程序,试图在WAN(从爱尔兰到纽约)上复制文件。

我最近修改了它,使用FileUtils,因为原生的Java文件复制太慢了。我调查并发现,因为Fileutils使用NIO,它更好。文件复制现在运行良好,但是偶尔需要复制非常大的文件(> 200Mb),复制会失败,错误如下:

java.io.IOException: Failed to copy full contents from...

我知道这个错误意味着目标文件的大小与源文件不同,所以起初我认为是网络问题。每隔几个小时,该过程会尝试重复复制文件,但从未成功。然而,当我通过Windows资源管理器手动复制文件时,它可以正常工作。这似乎排除了网络问题......但我不确定。
我已经搜索过,但没有找到任何帖子涉及完全相同的问题。非常感谢任何帮助。
谢谢!
补充说明: 我正在使用此FileUtils方法:
public static void copyFile(java.io.File srcFile, java.io.File destFile) throws java.io.IOException

可能是重复问题 https://dev59.com/YnDYa4cB1Zd3GeqPBIEm - Codey McCodeface
嗨,我看到了你提到的帖子,但那与文件锁定有关。每次我复制文件时,它都有一个唯一的名称,所以我没有那个问题。 - Tony
1
文件在你复制它的时候可能会发生变化吗?你使用的Apache IO版本是什么? - Codey McCodeface
嗨,我正在使用Commons IO 2.4。不,一旦文件被创建,它就不会改变。应用程序创建文件,以时间戳命名,然后尝试复制它。它每2小时运行一次,所以下一次它将有一个新的文件名。还要注意,较小的文件没有问题。这只在进程偶尔创建大文件时发生。谢谢! - Tony
如果您使用的是Java 7,则建议使用NIO。https://dev59.com/8nVD5IYBdhLWcg3wDHDm - Codey McCodeface
显示剩余2条评论
1个回答

4
所以,我发现问题出在目标文件夹上。有一个轮询进程应该在文件被复制后拾取它。然而,在复制完成之前,文件已经被移动了。这可能不会发生在Windows驱动器上,因为文件会被锁定(我在本地进行了测试,当文件正在复制时,无法删除它)。但是,目标文件夹是一个挂载的Celerra共享。底层的Unix进程是抓取文件的...我猜它不在乎一些Windows进程仍在写入它。

感谢您的时间,medPhys-pl!


我意识到这个问题已经超过6年了,但我很好奇你做了什么——改变了轮询器的行为(这似乎不太可能),还是其他什么? - sudeepgupta90
我忘记了这个!是的,最终我放弃了一个单独的文件作为标志,并且轮询过程在扫描目录之前等待它。 - Tony
啊。不幸的是,在我的情况下,我没有轮询器的所有权。太遗憾了。 - sudeepgupta90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接