在Java中合并二进制文件的最佳方法

时间:2016-05-15 10:52:22

标签: java disk

我正在开发一个基本的下载管理器,它可以使用多个连接通过http下载文件。在下载结束时,我有几个临时文件,其中包含文件的一部分。

我现在想将它们合并到一个文件中。

不难做到这一点,只需创建一个输出流并输入流,并以良好的顺序将输入传输到输出中。

但我想知道:有没有办法更有效地做到这一点?我的意思是,根据我的理解,这里将会发生的事情是JVM将每字节读取字节输入,并且每字节写入字节输出。

基本上我有: - 从磁盘读取字节 - 将字节存储在内存中 - 某些CPU指令可能会运行,并且该字节可能会被复制到CPU的缓存中 - 将字节写入磁盘

我想知道是否有办法将进程保留在磁盘上?我不知道我是否可以理解,但基本上是告诉磁盘"嘿,磁盘,拿走你的这些文件并与他们合作#34;

在短句中,我想减少CPU和内存使用率尽可能低。

1 个答案:

答案 0 :(得分:2)

理论上,可以在文件系统级别执行此操作:您可以将块列表从一个inode追加到另一个inode而不移动数据。但这不太实用,很可能您不得不绕过操作系统并直接访问磁盘。

下一个最好的事情可能是使用FileChannel.transferTo or transferFrom方法:

  

此方法可能比从此通道读取并写入目标通道的简单循环更有效。许多操作系统可以直接从文件系统缓存向目标通道传输字节,而无需实际复制它们。

您还应该使用流或RandomAccessFile测试读取和写入大块字节 - 它可能仍然比使用通道更快。这是一篇关于testing sequential IO performance in Java的好文章。