package JAVA做一个文件管理器;
import java.io.*;
import java.util.Scanner;
public class FileUtils {
public static void main(String[] args) throws IOException {
/** * 复制文件夹或文件夹 */
// 源文件夹
String url1 = "f:/photos";
// 目标文件夹
String url2 = "d:/tempPhotos";
// 创建目标文件夹
(new File(url2)).mkdirs();
// 获取源文件夹当前下的文件或目录
File[] file = (new File(url1)).listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isFile()) {
// 复制文件
copyFile(file[i],new File(url2+file[i].getName()));
}
if (file[i].isDirectory()) {
// 复制目录
String sourceDir=url1+File.separator+file[i].getName();
String targetDir=url2+File.separator+file[i].getName();
copyDirectiory(sourceDir, targetDir);
}
}
//输出语句(显示操作菜单)
System.out.println("**********1.指定关键字搜索 2.指定后缀名搜索 3.文件/文件夹复制 4.退出***********************");
System.out.println("请输入对应的操作");
//创建一个键盘扫描器
Scanner sc = new Scanner(System.in);
//接收用户的输入整数
int key = sc.nextInt();
//根据用户判断是哪一操作
//在等值比较的时候,优先考虑switch..case,但使用switch的时候一定要注意
//int char String 枚举
//byte short int char String 枚举
switch (key){
case 1:
//TODO 根据关键字搜索文件
searchByKeyWorld();
break;
case 2:
//TODO 根据指定的后缀名搜索文件
searchByLastWord();
break;
case 3:
//TODO 文件/文件夹的复制
break;
case 4:
//退出
System.exit(0);//中止
break;
default:
System.out.println("操作错误,请输入正确指令");
break;
}
}
private static void searchByLastWord() {
//提醒用户输入需要搜索的目录
Scanner sc = new Scanner(System.in);
System.out.println("请输入需要检索的目录:");
//再提醒用户输入需要搜索的后缀
String path = sc.nextLine();
System.out.println("请输入要检索的后缀");
String key = sc.nextLine();
File file = new File(path);
//通过用户指定的目录去搜索后缀
listSuffix(file,key);
//告诉用户是否搜索到文件
System.out.println("搜完了!");
}
private static void listSuffix(File file, String key) {
//获取当前目录所有File对象
File[] files = file.listFiles();
//把每一个file对象拿出来判断,首先判断是目录还是文件,
//如果是目录则继续搜索,文件则判断是否包含关键字
for (File file2 :files) {//JDK1.8新推出集合流式Api处理 集合Lambda表达式效果更佳
//判断元素是否是后缀
String exegc ="^"+key+"$";
if (file2.isDirectory()){
listFile(file2,key);
}else {
if (file2.getName().endsWith(exegc)){
System.out.println(file2.getAbsolutePath());
}
}
}
}
private static void searchByKeyWorld() {
//提醒用户输入需要搜索的目录
Scanner sc = new Scanner(System.in);
System.out.println("请输入需要检索的目录:");
//再提醒用户输入需要搜索的关键字
String path = sc.nextLine();
System.out.println("请输入要检索的关键字");
String key = sc.nextLine();
File file = new File(path);
//通过用户指定的目录去搜索指定关键字
listFile(file,key);
//告诉用户是否搜索到文件
System.out.println("搜完了!");
}
//具体搜索关键字的方法
private static void listFile(File file, String key) {
//获取当前目录所有File对象
File[] files = file.listFiles();
//把每一个file对象拿出来判断,首先判断是目录还是文件,
//如果是目录则继续搜索,文件则判断是否包含关键字
for (File file2 :files) {//JDK1.8新推出集合流式Api处理 集合Lambda表达式效果更佳
//判断元素是否是目录
if (file2.isDirectory()){
listFile(file2,key);
}else {
if (file2.getName().contains(key)){
System.out.println(file2.getAbsolutePath());
}
}
}
}
// 复制文件
public static void copyFile(File sourceFile,File targetFile) throws IOException{
// 新建文件输入流并对它进行缓冲
FileInputStream input = new FileInputStream(sourceFile);
BufferedInputStream inBuff=new BufferedInputStream(input);
// 新建文件输出流并对它进行缓冲
FileOutputStream output = new FileOutputStream(targetFile);
BufferedOutputStream outBuff=new BufferedOutputStream(output);
// 缓冲数组
byte[] b = new byte[1024 * 5];
int len;
while ((len =inBuff.read(b)) != -1) {
outBuff.write(b, 0, len);
}
// 刷新此缓冲的输出流
outBuff.flush();
//关闭流
inBuff.close();
outBuff.close();
output.close();
input.close();
}
// 复制文件夹
public static void copyDirectiory(String sourceDir, String targetDir) throws IOException {
// 新建目标目录
(new File(targetDir)).mkdirs();
// 获取源文件夹当前下的文件或目录
File[] file = (new File(sourceDir)).listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isFile()) {
// 源文件
File sourceFile=file[i];
// 目标文件
File targetFile=new File(new File(targetDir).getAbsolutePath() +File.separator+file[i].getName());
copyFile(sourceFile,targetFile);
}
if (file[i].isDirectory()) {
// 准备复制的源文件夹
String dir1=sourceDir + "/" + file[i].getName();
// 准备复制的目标文件夹
String dir2=targetDir + "/"+ file[i].getName();
copyDirectiory(dir1, dir2);
}
}
}
}