Test_Java_File类递归练习(拷贝文件)
需求:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
Test文件夹中包含两个文件夹,分别为src(原文件夹)和dest(目标文件夹)
在src的文件夹中包含若干个文件
dest文件夹为空文件夹
拷贝文件代码如下:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Scanner;
public class Test3 {
/*
* 需求:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
*
* 分析:
* 从键盘接收两个文件夹路径(对该方法调用两次)
* 1.创建键盘录入对象
* 2.定义一个无限循环
* 3.将键盘录入的结果存储并封装成File对象
* 4.对File对象判断
* 5.将文件夹路径对象返回
*
* 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
* 1.在目标文件夹中创建原文件夹
* 2.获取原文件中所有的文件和文件夹,存储在File数组中
* 3.遍历数组
* 4.如果是文件就用io流读写(io只能读取文件,不能读取文件夹)
* 5.如果是文件夹就递归调用
*/
public static void main(String[] args) throws Exception {
File src = getDir();
File dest = getDir();
//如果目标文件和原文件的路径相同,这可能会进入无限循环创建状态,直到内存爆炸,蓝屏死机为止
if(src.equals(dest)){
System.out.println("目标文件夹是原文件夹的子文件夹");
}else{
copy(src,dest);
}
}
/*
* 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
* 1.返回值类型void
* 2.参数列表File src, File dest
*/
public static void copy(File src, File dest) throws Exception {
//1.在目标文件夹中创建原文件夹
File newDir = new File(dest,src.getName());
newDir.mkdir();
//2.获取原文件中所有的文件和文件夹,存储在File数组中
File[] subFiles = src.listFiles();
//3.遍历数组
for (File subFile : subFiles) {
//4.如果是文件就用io流读写(io只能读取文件,不能读取文件夹)
if(subFile.isFile()){
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream(subFile));
BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream(new File(newDir,subFile.getName())));
int b;
while((b = bis.read()) != -1){
bos.write(b);
}
bis.close();
bos.close();
}else{
//5.如果是文件夹就递归调用
copy(subFile,newDir);
}
}
}
/*
* 从键盘接收一个文件夹路径:
* 1.返回值类型File
* 2.参数列表无
*/
public static File getDir(){
//1.创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件夹路径:");
//2.定义一个无限循环
while(true){
//3.将键盘录入的结果存储并封装成File对象
String line = sc.nextLine();
File dir = new File(line);
//4.对File对象判断
if(!dir.exists()){
System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:");
}else if(dir.isFile()){
System.out.println("您录入的是文件夹路径,请输入一个文件路径:");
}else{
//5.将文件夹路径对象返回
return dir;
}
}
}
}
执行该程序
查看dest文件夹中多了一个src文件夹,在src中包含了其中的内容
注意:如果原文件夹和目标文件夹的路径相同,即在同一个文件夹下不停地复制相同的文件夹,系统会崩溃。因此,要在调用copy()方法之前,首先要进行判断。
//如果目标文件和原文件的路径相同,这可能会进入无限循环创建状态,直到内存爆炸,蓝屏死机为止
if(src.equals(dest)){
System.out.println("目标文件夹是原文件夹的子文件夹");
}else{
copy(src,dest);
}