IO流实现文件夹拷贝
分为3个步骤进行实现:
一、判断
二、复制文件夹
三、复制文件
==================================判断地址是否条件需求==================================
/*条件:
1:俩个地址文件夹是否存在
2:目的地不能是相同目录下(相同目录一下不能存在相同名字的文件夹)
3:目的地不能是 拷贝文件的子目录
*/
public static void panDuan(String a, String b) {//重写方法,当传入的地址是字符串时转为flie对象调用相应的方法
panDuan(new File(a),new File(b));
}
public static void panDuan(File a, File b) {
String s = a.getAbsolutePath().toString();// a(数据源)绝对地址转为字符串
String s2 = b.getAbsolutePath().toString();// b(目的地)绝对地址转为字符串
String s1 = s.substring(0, s.lastIndexOf("\\"));// 取数据源最后一个 \ 之前的字符串
if (a.isDirectory() && b.isDirectory()) {//判断给的俩个路径是否正确
if (!(s2.equals(s1) || s2.equals((s1 + "\\")))) {// 判断文件拷贝的地址是不是当前文件所在路径下
System.out.println("验证1通过");
if (!s2.contains(s)) { // 判断s2 是否有s这个字符串(用来判断是否复制到了文件的子文件下)
System.out.println("验证2通过");
System.out.println("开始拷贝...");//满足以上要求再调用文件拷贝方法
cd02(a, b);
} else {
System.out.println("警告!不能拷贝到当前文件夹子目录下!!");
}
} else {
System.out.println("警告!不能拷贝到当前文件夹路径下!!");
}
}else System.out.println("警告!路径非法!!");
}
====================================复制文件夹=======================================
public static void cd02(File f1, File f2) {
File[] f11 = f1.listFiles();//创建f1路径下文件名的数组
File f4 = new File(f2.getAbsolutePath() + "/" + f1.getName());// 拼接目的地文件名
if (!f4.exists()) { // 判断目的地是否有该文件 没有就创建
f4.mkdir();
}
// System.out.println(f4);//可以打印判断下是否拼接正确
int a = 0, b = 0;
for (File j : f11) {//使用增强for遍历
if (j.isDirectory()) { //isDirectory()判断是否为文件夹
cd02(new File(f1 + "\\" + j.getName()), f4);// 遍历目标源目录中有文件夹则用该文件夹地址重新调用cd02方法,实现递归
a++;
}
if (j.isFile()) {// isFlie()判断是文件类型则调用文件拷贝
Copy(j,f4);// 调用Copy方法拷贝文件
}
}
b++;
if (a == b) {//当a和b相等的时候说明所有文件夹中已经全部拷贝完毕
System.out.println("拷贝完成!!!!");
}
}
====================================复制文件============================================
public static void Copy(File f, File f1) {
InputStream s = null;//多态定义读取空对象,提高写入效率
OutputStream out = null;//多态定义输出空对象,提高写入效率
try {
s = new FileInputStream(f);//把传入的file目标地址赋值给读取对象
File file = new File(f1.getPath() + File.separator + f.getName());//拼接 目的地 的该文件地址+文件名
out = new FileOutputStream(file);//把地址+文件名 赋值给 字节 输出对象 有文件则直接复制内容,没有文件则会自动创建文件夹并复制
int a = -1;
try { //while循环实现文件的拷贝
while ((a = s.read()) != -1) {//read() 读取,读取不到时会返回-1
out.write(a); //write() 输出
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
out.flush();//输出字节时有可能有残留,清理io流通道残留的字节
out.close();//关闭输出资源
s.close();//关闭写入资源 注意! 后开先关
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}