用Java复制大量文件的最快方法是什么。到目前为止,我已经使用了文件流和nio。整体流似乎比nio快。到目前为止你有什么经历?
答案 0 :(得分:20)
http://www.baptiste-wicht.com/2010/08/file-copy-in-java-benchmark/可能会得到你的答案。
对于基准测试,我使用不同的文件进行了测试。
- 小文件(5 KB)
- 中等文件(50 KB)
- 大文件(5 MB)
- 胖文件(50 MB)
- 一个巨大的文件(1.3 GB)只有二进制文件
醇>我首先使用文本文件然后使用二进制文件进行测试。我用三种模式进行测试:
- 在同一个硬盘上。这是一个250 GB的IDE硬盘,带有8 MB的缓存。它的格式为Ext4。
- 两个磁盘之间。我使用了第一个磁盘和另一个250 GB的SATA硬盘和16 MB的缓存。它的格式为Ext4。
- 两个磁盘之间。我使用了第一个磁盘和另一个1 TB的SATA硬盘和32 MB的缓存。它使用NTFS格式化。
醇>我使用基准框架described here来测试所有方法。测试是在我的个人计算机上进行的(Ubuntu 10.04 64位,Intel Core 2 Duo 3.16 GHz,6 Go DDR2,SATA硬盘)。使用的Java版本是Java 7 64位虚拟机...
答案 1 :(得分:9)
我会用:
import java.io.*;
import java.nio.channels.*;
public class FileUtils{
public static void copyFile(File in, File out)
throws IOException
{
FileChannel inChannel = new
FileInputStream(in).getChannel();
FileChannel outChannel = new
FileOutputStream(out).getChannel();
try {
inChannel.transferTo(0, inChannel.size(),
outChannel);
}
catch (IOException e) {
throw e;
}
finally {
if (inChannel != null) inChannel.close();
if (outChannel != null) outChannel.close();
}
}
public static void main(String args[]) throws IOException{
FileUtils.copyFile(new File(args[0]),new File(args[1]));
}
}
如果您的任何文件在Windows中大于64M,则可能需要查看以下内容: http://forums.sun.com/thread.jspa?threadID=439695&messageID=2917510
答案 2 :(得分:1)
让java fork一个复制文件的操作系统批处理脚本。您的代码可能必须编写批处理脚本。
答案 3 :(得分:1)
您可以使用apache commons-io库的FileUtils实现来复制文件
FileUtils.copyFile(new File(sourcePath), new File(destPath));
使用 FileChannel 进行IO操作。
或使用
java.nio.file.Files
' copy()
方法。
答案 4 :(得分:1)
它取决于文件(更大的文件),对我来说,这是具有缓冲流的最快方式
public void copyFile(File inFileStr, File outFileStr) throws IOException {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inFileStr));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outFileStr))) {
byte[] buffer = new byte[1024 * 1024];
int read = 0;
while ((read = bis.read(buffer)) != -1) {
bos.write(buffer, 0, read);
}
bis.close();
bos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
答案 5 :(得分:1)
使用流
int
使用频道
Bs...
使用Apache Commons IO
int
使用Java SE 7文件
private static void copyFileUsingStream(File source, File dest) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} finally {
is.close();
os.close();
}
}
性能测试
private static void copyFileUsingChannel(File source, File dest) throws IOException {
FileChannel sourceChannel = null;
FileChannel destChannel = null;
try {
sourceChannel = new FileInputStream(source).getChannel();
destChannel = new FileOutputStream(dest).getChannel();
destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
}finally{
sourceChannel.close();
destChannel.close();
}
}
结果
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
FileUtils.copyFile(source, dest);
}