先看下传统的方法:利用字节流直接复制
(f1输入文件夹,file是输出文件夹)
看看比较高效的方法,利用文件通道(FileChannel)来实现,可以节省1/3的时间。
看看代码:(这是文件的复制)
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();
}
}
}