1.指定关键字检索文件 2.指定后缀名检索文件 3.复制文件/文件夹 4.退出
用户可以输入对应功能来实现对文件及文件夹的操作
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++;
}
}
}
}
后缀名检索文件与关键字检索文件基本相同
需要用到
(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
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;
}
}
}
}
}
}
测试如下:
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;
}
}
}
}
}
}
}