在接的一个外包项目里面:有一个二维码扫描仪的二次开发的项目,在这里面有个问题就是需要将一个比较大的文件夹里面的所有内容复制到另外一个文件夹中,由于文件夹里面的内容还比较多,所以需要一点高效的方法。
当然传统的方法是按照字节去复制一个可以直接copy的文件,这样的速度还是挺慢的,对于我们那个200M的文件,大概需要2min的时间,这个有点长,公司那边希望时间短点,所以看到一个比较高效的方法,留着以后。。。
先看下传统的方法:利用字节流直接复制
public static void copy(File[] fl, File file) {
if (!file.exists()) // 如果文件夹不存在
file.mkdir(); // 建立新的文件夹
for (int i = 0; i < fl.length; i++) {
if (fl[i].isFile()) { // 如果是文件类型就复制文件
try {
FileInputStream fis = new FileInputStream(fl[i]);
FileOutputStream out = new FileOutputStream(new File(file
.getPath()
+ File.separator + fl[i].getName()));
int count = fis.available();
byte[] data = new byte[count];
if ((fis.read(data)) != -1) {
out.write(data); // 复制文件内容
}
out.close(); // 关闭输出流
fis.close(); // 关闭输入流
} catch (Exception e) {
e.printStackTrace();
}
}
if (fl[i].isDirectory()) { // 如果是文件夹类型
File des = new File(file.getPath() + File.separator
+ fl[i].getName());
des.mkdir(); // 在目标文件夹中创建相同的文件夹
copy(fl[i].listFiles(), des); // 递归调用方法本身
}
}
(f1输入文件夹,file是输出文件夹)
看看比较高效的方法,利用文件通道(FileChannel)来实现,可以节省1/3的时间。
看看代码:(这是文件的复制)
public 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();
}
}
}
如果想要文件夹的复制,那就还需要递归调用一下。