Java中IO流-32-File类递归练习-删除文件和文件夹拷贝

这篇继续来做递归的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方法去拷贝

你可能感兴趣的:(File递归练习题)