在 Java 中合并二进制文件的最佳方式
Best way to merge binary files in Java
我正在开发一个基本的下载管理器,它可以使用多个连接通过 http 下载文件。下载结束时,我有几个临时文件,其中包含文件的每一部分。
我现在想将它们合并成一个文件。
这并不难,只需创建一个输出流和输入流,然后按正确的顺序将输入通过管道传输到输出即可。
但我想知道:有没有办法更有效地做到这一点?我的意思是,根据我的理解,JVM 将逐字节读取输入,并逐字节写入输出。
所以基本上我有:
- 从磁盘读取字节
- 在内存中存储字节
- 一些 CPU 指令可能会 运行 并且字节可能会被复制到 CPU 的缓存中
- 将字节写入磁盘
我想知道是否有办法将进程保留在磁盘上?不知道我理解的对不对,但基本上就是告诉盘"hey disk, take these files of yours and make one with them"
简而言之,我想将 CPU 和内存使用率降低到尽可能低的水平。
理论上,可以在文件系统级别执行此操作:您可以将阻止列表从一个 inode 附加到另一个 inode,而无需移动数据。但这不是很实用,很可能您必须绕过操作系统并直接访问磁盘。
下一个最好的方法可能是使用 FileChannel.transferTo
or transferFrom
方法:
This method is potentially much more efficient than a simple loop that reads from this channel and writes to the target channel. Many operating systems can transfer bytes directly from the filesystem cache to the target channel without actually copying them.
您还应该测试使用流或 RandomAccessFile
读取和写入大字节块 - 它可能仍然比使用通道更快。这是一篇关于 testing sequential IO performance in Java.
的好文章
我正在开发一个基本的下载管理器,它可以使用多个连接通过 http 下载文件。下载结束时,我有几个临时文件,其中包含文件的每一部分。
我现在想将它们合并成一个文件。
这并不难,只需创建一个输出流和输入流,然后按正确的顺序将输入通过管道传输到输出即可。
但我想知道:有没有办法更有效地做到这一点?我的意思是,根据我的理解,JVM 将逐字节读取输入,并逐字节写入输出。
所以基本上我有: - 从磁盘读取字节 - 在内存中存储字节 - 一些 CPU 指令可能会 运行 并且字节可能会被复制到 CPU 的缓存中 - 将字节写入磁盘
我想知道是否有办法将进程保留在磁盘上?不知道我理解的对不对,但基本上就是告诉盘"hey disk, take these files of yours and make one with them"
简而言之,我想将 CPU 和内存使用率降低到尽可能低的水平。
理论上,可以在文件系统级别执行此操作:您可以将阻止列表从一个 inode 附加到另一个 inode,而无需移动数据。但这不是很实用,很可能您必须绕过操作系统并直接访问磁盘。
下一个最好的方法可能是使用 FileChannel.transferTo
or transferFrom
方法:
This method is potentially much more efficient than a simple loop that reads from this channel and writes to the target channel. Many operating systems can transfer bytes directly from the filesystem cache to the target channel without actually copying them.
您还应该测试使用流或 RandomAccessFile
读取和写入大字节块 - 它可能仍然比使用通道更快。这是一篇关于 testing sequential IO performance in Java.