尽管Java提供了java.io.File类来处理Java中文件操作,但是,在Java 7 之前,JDK并没有提供与文件复制相关的方法,而当项目中涉及到与文件相关的操作时,文件复制往往是不可或缺的。下面是几种常见的文件复制方法的。
具体可参考国外哥们写的文章
http://examples.javacodegeeks.com/core-java/io/file/4-
ways-to-copy-file-in-java/
1、利用FileStreams复制文件
这是大概是一种比较经典、使用最为广泛的的复制文件的方法了。只要利用FileInputStream从一个文件中读取一定的的字节数,再利用FileOutputStream写入另外一个文件就可以了。
class="java" name="code">
private static void copyFileUsingFileStreams(File source, File dest)
throws IOException {
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(source);
output = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
output.write(buf, 0, bytesRead);
}
} finally {
input.close();
output.close();
}
}
这种方法的弊端在于,当要复制大型文件时,因为要不断的进行读写操作,在效率方面,还是不那么好。
2、 利用Java 7 的新特性:Files.copy
从JDK 1.7 开始,与文件复制有关的工作,终于不用像上面那样做了,Oracle公司终于将这个方法给封装了起来,但是本质上和上面的方法还是一样的。
private static void copyFileUsingJava7Files(File source, File dest)
throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
好奇心驱使,看了下源代码,
发现这个方法的最终实现和我们上面的是一样的,有点区别的就是封装的copy方法缓存设置的大了一些,为8192,另外,这种方法是极力推荐的,因为它比其他两种方法效率都高;
private static long copy(InputStream source, OutputStream sink)
throws IOException
{
long nread = 0L;
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n = source.read(buf)) > 0) {
sink.write(buf, 0, n);
nread += n;
}
return nread;
}
3、利用java.nio.channels.FileChannel类进行文件复制
这种方法一般被认为效率是比较高的,但是我查看了下源代码,发现竟然没看懂。幸运的是,该方法使用起来还是相当的简单方便。
private static void copyFileUsingFileChannels(File source, File dest)
throws IOException {
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
inputChannel = new FileInputStream(source).getChannel();
outputChannel = new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} finally {
inputChannel.close();
outputChannel.close();
}
}