个人推荐:
📢📢📢 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下
"通俗易懂,风趣幽默"
,感觉非常有意思,忍不住分享一下给大家。
点击跳转到教程。
一:项目结构
二:项目分析
三:代码详情
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);
}
}
}
四:运行效果
【指定关键字检索文件】:
【指定后缀名检索文件】:
【复制文件/目录】:
【退出】: