2016-05-15 41 views
1

我正在开发一个基本的下载管理器,它可以使用多个连接通过http下载文件。在下载结束时,我有几个临时文件包含每个文件的一部分。用Java合并二进制文件的最佳方法

我现在想把它们合并成一个文件。

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

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

所以基本上我有: - 内存 店字节 - - 从磁盘读取 字节一些CPU指令可能会运行和字节可能会被复制到CPU的缓存 - 写字节磁盘

我想知道是否有办法在磁盘上保留进程?我不知道我是否可以理解,但基本上要告诉磁盘“嘿盘,把你的这些文件,并与他们一个”

在一个简短的句子,我想减少CPU &内存使用情况尽可能最低。

+2

在这里你去:https://thomaswabner.wordpress.com/2007/10/09/fast-stream-copy-using-javanio-channels/ – 2016-05-15 10:54:24

+0

连接文件是太罕见的操作,以添加到常见的低级别DOS操作。但上面的链接还有很长的路要走。请注意,它的一个优化是使用大小为最常用磁盘页面大小的大型中间缓冲区。 – usr2564301

+0

@RafaelOsipov:这看起来很不错,谢谢 – Tiller

回答

2

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

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

这种方法可能比一个简单的循环,从该信道的读取和写入到所述目标信道有效得多。许多操作系统可以直接从文件系统缓存中将字节传输到目标通道,而无需实际复制它们。

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

+1

我跑了一些我自己的测试,对于大文件,它会出现频道对我而言是最棒的。在我的测试案例中,速度快了5到10倍。谢谢。 – Tiller

相关问题