Java模拟文件管理器

一:项目结构

在这里插入图片描述

二:项目分析

Java模拟文件管理器_第1张图片

三:代码详情

FileUtils类

package example17;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.OutputStreamWriter;
import java.nio.file.Files;
import java.util.ArrayList;

/*
 * 文件工具类
 */
public  class FileUtils {
	/*
	 * 指定关键字检索文件
	 * @param file  File对象
	 * @param key  关键字
	 * @return 包含关键字的文件路径
	 */
	  public static ArrayList<String>  listFiles(File file,final String key) {
		  //创建过滤器对象
		  FilenameFilter filter=new FilenameFilter() {
			//如果文件名包含关键字返回true,否则返回false
			@Override
			public boolean accept(File dir, String name) {
				// TODO Auto-generated method stub
				File currFile=new File(dir,name);
				if (currFile.isFile()&&name.contains(key)) {
					return true;
				}
				return false;
			}
		};
		//递归方式获取规定的路径
		ArrayList<String>arrayList=fileDir(file,filter);
		return arrayList;
      }

	/*
	 * 递归方式获取规定的路径
	 * @param dir  file对象
	 * @param filter  过滤器
	 * @return 过滤器过滤后的文件路径
	 */
	private static ArrayList<String> fileDir(File dir, FilenameFilter filter) {
		// TODO Auto-generated method stub
		ArrayList<String>arrayList=new ArrayList<>();
		//获取过滤后的所有文件
		File[] lists=dir.listFiles(filter);
		for(File list:lists){
			//将文件的绝对路径放到集合中
			arrayList.add(list.getAbsolutePath());
		}
		//获取当前目录下所有的文件数组
		File[]files=dir.listFiles();
		//遍历所有的子目录和文件
		for(File file:files){
			if (file.isDirectory()) {
				//如果是目录,递归调用fileDir
				ArrayList<String>every=fileDir(file, filter);
				//将文件夹下的文件路径添加到集合
				arrayList.addAll(every);
			}
		}
		//此时的集合中当前目录下的文件路径,和当前目录的子目录下的文件路径
		return arrayList;
	}
	
	/*
	 * 指定后缀名检索文件
	 * @param file  File对象
	 * @param suffixArray 后缀名数组
	 * @return 指定后缀的文件路径
	 */
	public static ArrayList<String>listFiles(File file,final String[] suffixArray){
		//创建过滤器对象
		FilenameFilter filter=new FilenameFilter() {	
			@Override
			public boolean accept(File dir, String name) {
				// TODO Auto-generated method stub
				File currFile=new File(dir,name);
				//如果文件名以指定后缀名结尾返回true,否则返回false
				if (currFile.isFile()) {
					for(String suffix:suffixArray){
						if (name.endsWith("."+suffix)) {
							return true;
						}
					}
					
				}
				return false;
			}
		};
		//递归方式获取规定的路径
		ArrayList<String>arrayList=fileDir(file, filter);
		return arrayList;
	}
	
	
	/*
	 * 复制文件/目录
	 * @param srcFile 源目录
	 * @param destFile 目标文件
	 */
	public static void copySrcPathToDesPath(File srcDir,File destDir)
			throws Exception{
		File[]files=srcDir.listFiles();//子文件目录
		for(int i=0;i<files.length;i++){
			//创建指定目录的文件
			File copiedFile=new File(destDir,files[i].getName());
			//如果是目录
			if (files[i].isDirectory()) {
				//创建文件夹
				if (!copiedFile.mkdirs()) {
					System.out.println("无法创建:"+copiedFile);
					return;
				}
				//调用递归,获取子文件夹下的文件路径
				copySrcPathToDesPath(files[i],copiedFile);
			}else {
				//复制文件
				FileInputStream input=new FileInputStream(files[i]);//获取输入流
				FileOutputStream out=new FileOutputStream(copiedFile);//获取输出流
				byte[]buffer=new byte[1024];//创建缓冲区
				int n=0;
				//循环读取字节
				while ((n=input.read(buffer))!=-1) {
					out.write(buffer,0,n);
				}
				//关闭输入流
				input.close();
				//关闭输出流
				 out.close();
			}
		}
	}
}

DocumentManager类

package example17;
import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;
import projectActualCombat.FileUtil;
/*
 * 模拟文件管理器
 */
public class DocumentManager {
	        public static void main(String[] args) throws Exception {
	        	Scanner sc=new Scanner(System.in);
				System.out.println("1:指定关键字检索文件;2:指定后缀名检索文件;3:复制文件/目录;4:退出");
				while (true) {
					System.out.println("请输入指令:");
					int command=sc.nextInt();
					switch (command) {
					case 1:
						searchByKeyWord();//指定关键字检索文件
						break;
                    case 2:
                    	searchBySuffix();//指定后缀名检索文件
                    	 break;
                    case 3:
                    	copyDirectory();//复制文件/目录
                    	 break;
                    case 4:
                    	 exit_OBJ();//退出系统
                    	 break;
					default:
						System.out.println("你输入的指令有误");
						break;
					}
				}
			}

	        /*
	         * 退出
	         */
			private static void exit_OBJ() {
				// TODO Auto-generated method stub
				System.out.println("你已退出系统,谢谢使用!");
				System.exit(0);
			}

			/*
			 * 复制文件/目录
			 */
			private static void copyDirectory() throws Exception {
				// TODO Auto-generated method stub
				Scanner sc=new Scanner(System.in);
				System.out.println("请输入源目录:");
				String srcDirectory=sc.next();//从控制台获取源路径
				File srcFile=new File(srcDirectory);
				//判断目录是否存在,是否是目录
				if (!srcFile.exists()||!srcFile.isDirectory()) {
					System.out.println("无效目录!");
					return;
				}
				System.out.println("请输入目标位置:");
				String destDirectory=sc.next();//从控制台获取路径
				File destFile=new File(destDirectory);
				if (!destFile.exists()||!destFile.isDirectory()) {
					//判断目录是否存在,是否是目录
					System.out.println("无效位置!");
					return;
				}
				//将源路径中的内容复制到目录路径下
				FileUtils.copySrcPathToDesPath(srcFile, destFile);
			}

			/*
			 * 指定后缀名检索文件
			 */
			private static void searchBySuffix() {
				// TODO Auto-generated method stub
				Scanner scan=new Scanner(System.in);
				System.out.println("请输入要检索的目录位置");
				String path=scan.next();
				File file=new File(path);
				//判断目录是否存在,是否是目录
				if (!file.exists()||!file.isDirectory()) {
					System.out.println("不是有效目录");
					return;
				}
				System.out.println("请输入搜索后缀:");
				String suffix=scan.next();//获取后缀字符串
				//在输入目录下获取所有指定后缀名的文件路径
				ArrayList<String>list=FileUtils.listFiles(file, suffix);
				for(Object obj:list){
					//将路径打印到控制台
					System.out.println(obj);
				}
			}

			/*
			 * 指定关键字检索文件
			 */
			private static void searchByKeyWord() {
				// TODO Auto-generated method stub
				Scanner sc=new Scanner(System.in);
				System.out.println("请输入要检索的目录位置:");
				String path=sc.next();
				File file=new File(path);
				//判断文件是否存在,是否是目录
				if (!file.exists()||!file.isDirectory()) {
					System.out.println("不是有效目录");
				    return;
				}
				
				System.out.println("请输入搜索关键字:");
				String key=sc.next();//获取关键字
				//在输入目录下获取所有包含关键字的路径
				ArrayList<String>list=FileUtils.listFiles(file, key);
				for(Object obj:list){
					//将路径打印到控制台
					System.out.println(obj);
				}
			}
}

四:运行效果

【指定关键字检索文件】:
Java模拟文件管理器_第2张图片
【指定后缀名检索文件】:
Java模拟文件管理器_第3张图片

【复制文件/目录】:
Java模拟文件管理器_第4张图片
Java模拟文件管理器_第5张图片
【退出】:
Java模拟文件管理器_第6张图片

你可能感兴趣的:(java基础)