Java File类及IO的运用,实现文件的检索和文件的复制粘贴

File / IO

一、功能分析

1.指定关键字检索文件 2.指定后缀名检索文件 3.复制文件/文件夹 4.退出

用户可以输入对应功能来实现对文件及文件夹的操作

二、设计思路

1.指定关键字检索文件

a)判断用户输入的路径是否存在;

b)对其关键字进行检索;

c)首先需要判断file是否为空或者路径或者文件是否存在(即文件是否可访问);

d)检索时需要用到File数组来存储用户所输入的路径中所有文件/文件夹的绝对路径;

e)用foreach循环来甄别每一个路径中的文件是否包含用户所输入的检索名;

f)检索时若不是一级子级则需要再展开子级,需要用到递归调用直到展开到一级子级;

核心代码如下:

/*
	 * 到用户指定的路径下面去搜索用户指定的关键字
	 */
	private static void listFiles(File file, String sca) {
		// 在访问系统文件,隐藏文件夹时,判断为空
		if (file == null || !file.exists()) {
			return;
		}
		// 获取当前目录下面的所有File对象
		File[] files = file.listFiles();
		// 用户输入的目录为空时直接返回
		if (files == null || files.length == 0) {
			return;
		}
		// 取出数组中的每一个元素进行甄别
		for (File f : files) {
			// 判断每一个元素是否是文件夹
			if (f.isDirectory()) {
				// 是文件夹
				listFiles(f, sca); // 递归调用直到展开所有文件夹
				directoryNum++;
			} else {
				// 已经展开所有文件夹,则可以判断是否为目标文件
				TotalNum++;
				if (f.getName().contains(sca)) {
					// 成立则打印出来绝对路径
					System.out.println(f.getAbsolutePath());
					filesTotalNum++;
				}
			}
		}
	}

2.指定后缀名检索文件

后缀名检索文件与关键字检索文件基本相同

需要用到

(String)substring(int beginIndex) 返回一个字符串,该字符串是此字符串的子字符串。

(int)indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引。

file.getName().substring((file.getName().indexOf(".")+1));

其他代码与检索关键字相同

sca.equals(f.getName().substring((f.getName().indexOf(".") + 1))) //return true

3.复制文件/文件夹

fr:所需复制的路径,fw:复制到的路径

a)首先获取需复制的文件路径,再获取所需复制到的路径,并判断两者是否存在;

b)需要判空,不可访问文件/文件夹直接返回;

c)先在fw建一个文件夹;

d)用foreach循环扫描所有文件/文件夹,利用递归调用,展开到所有一级子级;

e)扫描到的目标若是文件,则用IO流,对其文件进行读写到新文件;

核心代码:

@SuppressWarnings("resource")
	private static void fileCopy(File file1, File file2) throws IOException {
     
		// 判空
		if (!file1.exists() || file1 == null) {
     
			return;
		}

		// 创建文件夹
		file2.mkdir();

		// 获取当前目录下面的所有File对象
		File[] files1 = file1.listFiles();

		if (file1.isFile()) {
      //用户输入的目录直接为一个文件
			filesTotalNum++;
			String str = file1.getName();
			BufferedReader br = null;
			BufferedWriter bw = null;
			br = new BufferedReader(new InputStreamReader(new FileInputStream(file1.getPath() + "")));
			bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2.getPath() + "\\" + str)));
			String tString;
			while (true) {
     
				if ((tString = br.readLine()) != null) {
     
					bw.write(tString);
				} else {
     
					break;
				}
			}
		} else {
     
			for (File fr : files1) {
     
				directoryNum++;
				// 如果是文件夹
				if (fr.isDirectory()) {
     
					String str = fr.getName();
					File file = new File(file2.getPath() + "\\" + str);
					file.mkdir();
					fileCopy(fr, file2);
				} else if (fr.isFile()) {
     
					filesTotalNum++;
					String str = fr.getName();
					BufferedReader br = null;
					BufferedWriter bw = null;
					br = new BufferedReader(new InputStreamReader(new FileInputStream(fr.getPath() + "")));
					bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2.getPath() + "\\" + str)));
					String tString;
					while (true) {
     
						if ((tString = br.readLine()) != null) {
     
							bw.write(tString);
						} else {
     
							break;
						}

					}
				}
			}
		}
	}

三、效果测试

测试如下:

Java File类及IO的运用,实现文件的检索和文件的复制粘贴_第1张图片

四、代码如下

FileMain

package Files;

import java.io.IOException;
import java.util.Scanner;

/*
 * File文件夹的操作
 */
public class FileMain {
     
	/*
	 * 程序的主入口 功能分析 1.指定关键字检索文件 2.指定后缀名检索文件 3.复制文件/文件夹 4.退出
	 */
	public static void main(String[] args) throws IOException {
     

		while (true) {
     
			// 显示主菜单
			System.out.println("**** 1.指定关键字检索文件    2.指定后缀名检索文件    3.复制文件/文件夹    4.退出 ****");
			// 提示用户选择
			System.out.println("请输入你所选择的操作:");
			// 创建输入
			Scanner key = new Scanner(System.in);
			// 接收选择
			String choice = key.nextLine();
			// 抉择功能
			switch (choice) {
     
			case "1":
				// 关键字检索文件
				SearchByKeyWorld.Search();
				break;
			case "2":
				// 后缀名检索文件
				SearchByKeyPostfix.Seacrch();
				break;
			case "3":
				// 文件/文件夹的复制
				CopyF1toF2.copy();
				break;
			case "4":
				System.out.println("谢谢使用!");
				// 退出程序
				System.exit(0);
				break;
			default:
				System.out.println("请输入正确的功能键!");
				break;
			}
		}
	}
}

SeachByKeyWorld

package Files;

import java.io.File;
import java.util.Scanner;

public class SearchByKeyWorld {
     
	public static int filesTotalNum = 0; // 当前目标文件总数
	public static int directoryNum = 0; // 当前目录文件夹总数
	public static int TotalNum = 0; // 当前检索文件总数
	/*
	 * 检索方法
	 */

	public static void Search() {
     
		Scanner key = new Scanner(System.in);
		System.out.println("请输入要扫描的盘符路径:");
		// 用以接收用户输入的路径
		String path = key.nextLine();
		// 创建File文件对象
		File file = new File(path);
		// 判断路径是否存在,不存在则重新输入
		do {
     
			if (file.exists()) {
     
				break;
			} else {
     
				System.out.println("输入路径错误,请重新输入:");
				path = key.nextLine();
			}
		} while (true);
		System.out.println("请输入检索的关键字:");

		// 用以接收用户输入的关键字
		String sca = key.nextLine();

		// 开始时间
		long beginTime = System.currentTimeMillis() / 1000;

		// 到用户指定的路径下面去搜索用户指定的关键字
		listFiles(file, sca);

		// 输出用户所输入的目录有多少文件和文件夹
		System.out.println(path + "中一共检索文件夹" + directoryNum + "个");
		System.out.println(path + "中一共检索文件" + TotalNum + "个" + " 发现目标文件" + filesTotalNum + "个");

		// 结束检索时间
		long endTime = System.currentTimeMillis() / 1000;
		System.out.println("总共耗时:" + Long.toString(endTime - beginTime) + "秒");

		// 清零
		filesTotalNum = 0;
		directoryNum = 0;
		TotalNum = 0;
	}

	/*
	 * 到用户指定的路径下面去搜索用户指定的关键字
	 */
	private static void listFiles(File file, String sca) {
     
		// 在访问系统文件,隐藏文件夹时,判断为空
		if (file == null || !file.exists()) {
     
			return;
		}
		// 获取当前目录下面的所有File对象
		File[] files = file.listFiles();
		// 用户输入的目录为空时直接返回
		if (files == null || files.length == 0) {
     
			return;
		}
		// 取出数组中的每一个元素进行甄别
		for (File f : files) {
     
			// 判断每一个元素是否是文件夹
			if (f.isDirectory()) {
     
				// 是文件夹
				listFiles(f, sca); // 递归调用直到展开所有文件夹
				directoryNum++;
			} else {
     
				// 已经展开所有文件夹,则可以判断是否为目标文件
				TotalNum++;
				if (f.getName().contains(sca)) {
     
					// 成立则打印出来绝对路径
					System.out.println(f.getAbsolutePath());
					filesTotalNum++;
				}
			}
		}
	}
}

SeachByKeyPostfix

package Files;

import java.io.File;
import java.util.Scanner;

public class SearchByKeyPostfix {
     
	public static int filesTotalNum = 0; // 当前目标文件总数
	public static int directoryNum = 0; // 当前目录文件夹总数
	public static int TotalNum = 0; // 当前检索文件总数
	/*
	 * 检索方法
	 */

	public static void Seacrch() {
     
		Scanner key = new Scanner(System.in);
		System.out.println("请输入要扫描的盘符路径:");
		// 用以接收用户输入的路径
		String path = key.nextLine();
		// 创建File文件对象
		File file = new File(path);
		// 判断路径是否存在,不存在则重新输入
		do {
     
			if (file.exists()) {
     
				break;
			} else {
     
				System.out.println("输入路径错误,请重新输入:");
				path = key.nextLine();
			}
		} while (true);

		System.out.println("请输入检索的目标属于何种类型文件(后缀名):");
		// 用以接收用户输入的后缀名
		String postfix = key.nextLine();

		// 开始时间
		long beginTime = System.currentTimeMillis() / 1000;

		// 到用户指定的路径下面去搜索用户指定的关键字
		listFiles(file, postfix);

		// 输出用户所输入的目录有多少文件和文件夹
		System.out.println(path + "中一共检索文件夹" + directoryNum + "个");
		System.out.println(path + "中一共检索文件" + TotalNum + "个" + " 发现目标文件" + filesTotalNum + "个");

		// 结束检索时间
		long endTime = System.currentTimeMillis() / 1000;
		System.out.println("总共耗时:" + Long.toString(endTime - beginTime) + "秒");

		// 清零
		filesTotalNum = 0;
		directoryNum = 0;
		TotalNum = 0;
	}

	/*
	 * 到用户指定的路径下面去搜索用户指定的关键字
	 */
	private static void listFiles(File file, String sca) {
     
		// 在访问系统文件,隐藏文件夹时,判断为空
		if (file == null || !file.exists()) {
     
			return;
		}
		// 获取当前目录下面的所有File对象
		File[] files = file.listFiles();
		// 用户输入的目录为空时直接返回
		if (files == null || files.length == 0) {
     
			return;
		}
		// 取出数组中的每一个元素进行甄别
		for (File f : files) {
     
			// 判断每一个元素是否是文件夹
			if (f.isDirectory()) {
     
				// 是文件夹
				listFiles(f, sca); // 递归调用直到展开所有文件夹
				directoryNum++;
			} else {
     
				// 已经展开所有文件夹,则可以判断是否为目标文件
				TotalNum++;
				if (sca.equals(f.getName().substring((f.getName().indexOf(".") + 1)))) {
     
					// 成立则打印出来绝对路径
					System.out.println(f.getAbsolutePath());
					filesTotalNum++;
				}
			}
		}
	}
}

CopyF1toF2

package Files;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;

public class CopyF1toF2 {
     
	public static int filesTotalNum = 0; // 当前目标文件总数
	public static int directoryNum = 0; // 当前目录文件夹总数
	/*
	 * 复制方法
	 */

	public static void copy() throws IOException {
     
		Scanner key = new Scanner(System.in);
		System.out.println("请输入需要复制的文件夹路径:");
		// 用以接收用户输入的路径
		String path1 = key.nextLine();
		// 创建File文件对象
		File file1 = new File(path1);
		// 判断路径是否存在,不存在则重新输入
		do {
     
			if (file1.exists()) {
     
				break;
			} else {
     
				System.out.println("输入路径错误,请重新输入:");
				path1 = key.nextLine();
			}
		} while (true);

		System.out.println("请输入需要复制到那个路径:");
		// 用以接收用户输入的路径
		String path2 = key.nextLine();
		// 创建File文件对象
		File file2 = new File(path2);
		// 判断路径是否存在,不存在则重新输入
		do {
     
			if (file2.exists()) {
     
				break;
			} else {
     
				System.out.println("输入路径错误,请重新输入:");
				path2 = key.nextLine();
			}
		} while (true);

		// 开始时间
		long beginTime = System.currentTimeMillis();
		fileCopy(file1, file2);
		// 结束时间
		long endTime = System.currentTimeMillis();

		System.out.println("复制成功!总共复制文件夹" + directoryNum + "个\n" + "复制文件" + filesTotalNum + "个\n" + "总耗时"
				+ Long.toString(endTime - beginTime));
	}

	@SuppressWarnings("resource")
	private static void fileCopy(File file1, File file2) throws IOException {
     
		// 判空
		if (!file1.exists() || file1 == null) {
     
			return;
		}

		// 创建文件夹
		file2.mkdir();

		// 获取当前目录下面的所有File对象
		File[] files1 = file1.listFiles();

		if (file1.isFile()) {
      //用户输入的目录直接为一个文件
			filesTotalNum++;
			String str = file1.getName();
			BufferedReader br = null;
			BufferedWriter bw = null;
			br = new BufferedReader(new InputStreamReader(new FileInputStream(file1.getPath() + "")));
			bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2.getPath() + "\\" + str)));
			String tString;
			while (true) {
     
				if ((tString = br.readLine()) != null) {
     
					bw.write(tString);
				} else {
     
					break;
				}
			}
		} else {
     
			for (File fr : files1) {
     
				directoryNum++;
				// 如果是文件夹
				if (fr.isDirectory()) {
     
					String str = fr.getName();
					File file = new File(file2.getPath() + "\\" + str);
					file.mkdir();
					fileCopy(fr, file2);
				} else if (fr.isFile()) {
     
					filesTotalNum++;
					String str = fr.getName();
					BufferedReader br = null;
					BufferedWriter bw = null;
					br = new BufferedReader(new InputStreamReader(new FileInputStream(fr.getPath() + "")));
					bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2.getPath() + "\\" + str)));
					String tString;
					while (true) {
     
						if ((tString = br.readLine()) != null) {
     
							bw.write(tString);
						} else {
     
							break;
						}

					}
				}
			}
		}
	}
}

你可能感兴趣的:(java,算法,window)