这篇继续来做递归的File操作相关练习题,第一题是删除文件夹,第二个是模拟两个文件夹之间的拷贝。因为都存在文件夹下有文件,所以都需要利用递归调用,第二条,文件拷贝还需要用上IO流的读和写。
1.删除一个文件夹下所有文件和子文件夹
分析:
1)获取该文件夹下的所有文件和文件夹,之前前面做过,已有代码
2)遍历文件数组
3)判断是文件就直接删除
4)判断是文件夹,就递归调用
5)循环结束之后,把空文件夹全部删除
代码实现:
package io;
import java.io.File;
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
File dir = getDir();
deleteFolder(dir);
}
/**
* 获取文件夹路径
* @return
*/
public static File getDir () {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件路径。");
while(true) {
String line = sc.nextLine(); //键盘录入文件夹路径存储
File dir = new File(line); //封装file对象
//判断
if( !dir.exists()) {
System.out.println("你输入的文件夹路径不存在,请重新输入。");
}else if(dir.isFile()) {
System.out.println("你输入的是一个文件的路径,请换成文件夹路径");
}else {
return dir;
}
}
}
/**
* 删除该文件夹
*
*/
public static void deleteFolder(File dir) {
//1.获取该路径下所有文件夹和文件夹
File[] subFiles = dir.listFiles();
//2.遍历数组
for (File subfile : subFiles) {
//3.判断是文件就删除
if( subfile.isFile()) {
subfile.delete();
}else {
//4.是文件夹就递归调用,删除文件
deleteFolder(subfile);
}
}
//5.循环结束之后,删除文件夹
dir.delete();
}
}
2.键盘给定两个文件夹路径,递归实现文件拷贝
这个题目就是模拟文件夹的拷贝过程。例如原文件夹是A,目标文件夹是B,A中有数据(文件和文件夹),B是空的,拷贝之后就有A一样文件和文件夹。
分析:
1)在目标文件夹中,创建原文件夹
2)获取原文件夹中所有的文件和文件夹,存储在File数组中
3)遍历数组,判断
4)如果是文件,就利用IO流读写,实现拷贝
5)如果是文件夹,递归调用
代码实现
package io;
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.io.IOException;
import java.util.Scanner;
public class Test7 {
public static void main(String[] args) throws IOException {
File src = getDir();
File dest = getDir();
copy(src,dest);
}
/**
* 获取文件夹路径
* @return
*/
public static File getDir () {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件路径。");
while(true) {
String line = sc.nextLine(); //键盘录入文件夹路径存储
File dir = new File(line); //封装file对象
//判断
if( !dir.exists()) {
System.out.println("你输入的文件夹路径不存在,请重新输入。");
}else if(dir.isFile()) {
System.out.println("你输入的是一个文件的路径,请换成文件夹路径");
}else {
return dir;
}
}
}
/**
* 文件拷贝
* 1.返回值类型是void
* 2.参数列表 File src, File dest
* @throws IOException
*/
public static void copy(File src, File dest) throws IOException {
//1.在目标文件夹中,创建原文件夹,在dest文件中先创建src这个文件夹名称
File newDir = new File(dest,src.getName());
newDir.mkdir();
//2.获取原文件夹中所有的文件和文件夹,存储在File数组中
File[] subFiles = src.listFiles();
//3.遍历数组
for (File subfile : subFiles) {
//4.如果是文件,就利用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 {
copy(subfile, newDir); //拷贝文件夹
}
}
}
}
上面方法会出现一个异常,如果src和dest提供路径一模一样,例如就会在src下不断死循环地拷贝文件,直到你机器死机。所以,在main()方法需要写一个if判断,如果src和dest相等(equals),就写一个相关提示,否则就调用copy方法去拷贝