在复制大文件时,FileChannel复制文件的速度比BufferedInputStream/BufferedOutputStream复制文件的速度快了近三分之一,体现出FileChannel的速度优势。而且FileChannel是多并发线程安全的。
但是:在复制小文件是,尤其是只有几KB的文件时,FIleChannel方式并不具备优势,反而比流的方式慢得多。
这里附上代码,如下:
public class Test2 {
public static void main(String[] args){
File s = new File("E:\\source.zip");
File t = new File("F:\\target.zip");
long start, end;
start = System.currentTimeMillis();
fileChannelCopy(s,t);//文件通道方式复制
end = System.currentTimeMillis();
System.out.println("FileChannel复制,用时"+(end - start)+"ms");
start = System.currentTimeMillis();
fileStreamCopy(s,t);//缓冲输入输出流方式复制
end = System.currentTimeMillis();
System.out.println("Buffered复制,用时"+(end - start)+"ms");
}
/**
* 使用文件通道(FileChannel)方式复制文件
*
* @param s 复制的源文件
* @param t 写入的目标文件
*/
public static void fileChannelCopy(File s, File t){
FileInputStream fi = null;
FileOutputStream fo = null;
FileChannel in = null;
FileChannel out = null;
try{
fi = new FileInputStream(s);
fo = new FileOutputStream(t);
in = fi.getChannel();//得到对应的文件通道
out = fo.getChannel();//得到对应的文件通道
in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道
}catch(IOException e){
e.printStackTrace();
}finally{
try{
fi.close();
in.close();
fo.close();
out.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
/**
* 使用输入输出流方式复制文件
*
* @param s 复制的源文件
* @param t 写入的目标文件
*/
public static void fileStreamCopy(File s, File t){
InputStream fis = null;
OutputStream fos = null;
try{
fis = new BufferedInputStream(new FileInputStream(s));
fos = new BufferedOutputStream(new FileOutputStream(t));
byte[] buf = new byte[1024];
int length;
while((length = fis.read(buf)) != -1){
fos.write(buf, 0, length);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(fis != null){
fis.close();
}
if(fos != null){
fos.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}