Java文件高性能移动

4

我正在编写一个媒体转码服务器,需要在文件系统中移动文件。目前我面临的困境是,是否可以用其他更高效的方法替换Java的renameTo函数。我考虑使用exec("mv file1 file2"),但这只是我的最后选择。有没有人有类似的经验或可以帮助我找到解决方案?


调用一个调用系统调用的API为什么会比执行调用相同系统调用的程序慢? - user207421
3个回答

8
首先,renameTo 可能只是包装了一个系统调用。
其次,在Unix系统中,移动文件不涉及从文件本身复制任何数据。所有发生的事情就是从旧目录中删除链接,并添加到新目录的链接。我认为你在这里不会找到任何性能改进。

许多Un*x系统都配备有一个以上的分区(可以在同一硬盘上或分布在多个硬盘上),从一个分区移动到另一个分区肯定涉及从文件本身复制数据 ;) - NoozNooz42
@NoozNooz42:OP说他想要“在文件系统中移动文件”,而不是从一个文件系统移动到另一个文件系统。 - danben
1
有没有一个地方可以看到Java renameTo调用的实现代码? - Ankur Chauhan
在源代码中,它只是调用了一个本地方法;你可能需要下载OpenJDK并深入研究。 - danben

1

我认为使用文件的默认方法并不会有明显的性能损失,因为大多数JVM到操作系统的函数已经包装了本地调用。

唯一需要使用exec的情况是如果您想要以与程序不同的权限执行某些操作或者使用特殊工具来复制/移动文件。(例如,在涉及ntfs-junctions时使用smart-move)


0
如果重命名是一个显著的性能瓶颈,那么您需要改善硬件,因为这是主要限制因素。软件只占用了很少的时间,优化它也不会有太大的差别。
您的磁盘配置是什么?它如何针对写入进行优化?

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