欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中复制文件的三种方法 博客分类: Java javaFiles.copy文件复制 

程序员文章站 2024-03-19 22:06:40
...
   尽管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写入另外一个文件就可以了。
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();
	}
}