Java File类及IO的运用,实现文件的检索和文件的复制粘贴_补充附录7,实现一个文件复制类filetools-程序员宅基地

技术标签: 算法  java  window  

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;
						}

					}
				}
			}
		}
	}

三、效果测试

测试如下:

image-20210128141522047

四、代码如下

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;
						}

					}
				}
			}
		}
	}
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28618027/article/details/113483873

智能推荐

TPC-H测试数据表生成,以及在Impala中的使用_impala tpch-程序员宅基地

文章浏览阅读6.4k次。一、下载TPCH生成工具官方网址:http://www.tpc.org/tpc_documents_current_versions/current_specifications.asp本文中安装的是:TPC-H 2.17.1 pdf Download TPCH_Tools.zip可通过wget、curl来获取安装包。【注】获取包地址,需要填写Email信息进行申请,无伤_impala tpch

Moss 2007 入门(1) - 功能概述 _crm moss-程序员宅基地

文章浏览阅读1.1k次。http://www.cnblogs.com/wfconquer/archive/2006/12/04/580989.htmlMoss 2007 入门(1) - 功能概述 Microsoft Office Sharepoint Server 2007(MOSS 2007) 是微软最新推出的服务器产品,由于工作原因,在今后的很长一段时间内我的主要工作内容都将为围绕着这个产品展开的,_crm moss

vue+element-ui 记住密码_elementui3输入框记住密码的样式-程序员宅基地

文章浏览阅读1.6k次。实现,勾选多选框记住密码实现思路是判断是否点击记住密码,点击就将账户和密码写到cookie中,设置存储时间,下次登录就会自动记住密码点击登录按钮就可以登录,若未选择记住密码,则不会记住密码记住一点:密码和账户需要加密保存,保证安全。<el-checkbox v-model="checked" class="font-16 text-green hk-cursor">记住密码<..._elementui3输入框记住密码的样式

手把手教你用Python批量实现文件夹下所有Excel文件的第二张表合并-程序员宅基地

文章浏览阅读1.6k次。点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤怀君属秋夜,散步咏凉天。大家好,我是Python进阶者。今天继续给..._利用python,实现excel三张表的第二张表数据操作

[完]机器学习实战 第三章 决策树(Decision Tree)_moudle对象的决策树-程序员宅基地

文章浏览阅读1.7k次。本章介绍了什么是决策树,如何构建决策树,构建决策树时选择哪个特征划分数据,根据什么(香农熵)划分数据。介绍了信息论里的基本概念:熵、信息增益。用字典存储决策树,程序实现了决策树。并且介绍了如何使用matplotlib如何图形化显示决策树。_moudle对象的决策树

【java基础】理解面向对象OOP-程序员宅基地

文章浏览阅读271次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、面向过程与面向对象二、类与对象总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入前言Java是一门面向

随便推点

Unity中基于VideoPlayer组件的视频播放_unity2d videoplayer位置-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏10次。Unity版本5.6.7用UI组件来实现视频的播放参考博文:https://blog.csdn.net/m0_37679113/article/details/80087473 感谢作者大大,收获颇多!在此作自我整理与回顾1.创建Render Texture 在Project下选择想要创建Render Texture的文件夹下 右键Create->Re..._unity2d videoplayer位置

进一步了解XPath(利用XPath爬取飞哥的博客)【python爬虫入门进阶】(04)-程序员宅基地

文章浏览阅读2.1k次,点赞7次,收藏14次。XPath爬我们想爬之数据。_爬取

Pyinstaller 打包以及pipenv 虚拟环境应用,以及打包出来程序太大的解决办法_pil打包的程序很大-程序员宅基地

文章浏览阅读772次。直接在基本环境中使用Pyinstaller将pyinstaller 打包成exe, 打包出来的exe会非常大,最好用pipenv创建一个虚拟环境。在虚拟环境中安装你写的python程序需要的各种包,记得还要安装pyinstaller安装好pipinstaller后pipenv install 创建一个新环境pipenv shell 进入虚拟环境pip install 各种包pip install pyinstaller 这个也要啊。特别注意,如果导入了numpy 这种包,_pil打包的程序很大

Window 上安装 MongoDB PHP扩展_windows php8 mongo ext-程序员宅基地

文章浏览阅读93次。1.通过浏览器访问phpinfo;查看php的architecture版本是X64还是X86;安全模式是TS还是NTS;2. https://www.runoob.com/mongodb/mongodb-install-php-driver.html 安装mongodb。通过浏览器访问phpinfo,查看是否安装成功,如果安装成功,如下:..._windows php8 mongo ext

本质矩阵,基础矩阵,自由度及其解法_为什么尺度等价性会降低自由度-程序员宅基地

文章浏览阅读1.1k次。一:为什么本质矩阵的秩为2?二:为什么基础矩阵的秩为2?三:为什么尺度等价性要减少一个自由度?四:为什么基础矩阵自由度是7?五:为什么本质矩阵自由度是5?六:为什么单应矩阵自由度是8?七:计算基础矩阵(1) 基于代数误差的线性估计(8点法和7点法,6点法)(2) 基于几何误差的非线性估计 (点到对应极线距离的平方和作为误差,重投影误差)八:计算本质矩阵(8点法和5点法)九:计算单应矩阵十:从本质矩阵恢复相机运动R,t(4种可能)十一:从单应矩阵恢复相机运动R,t(8种可能)SLAM_为什么尺度等价性会降低自由度

再见,汉堡菜单,我们有了新的 Android 交互设计方案-程序员宅基地

文章浏览阅读314次。本文讲的是再见,汉堡菜单,我们有了新的 Android 交互设计方案,我清楚地记得 3 月 15日当那条新闻传来的时候我正在干什么——当我们正深陷于将我们Android 职位搜索应用中的汉堡菜单抛弃,转而使用一种可见的标签式导航时,谷歌宣布将底部导航栏添加到 Android Material Design 的指导手册中,这个新闻快速传遍了 An..._移动端汉堡菜单交互