一:指定一个目录,扫描这个目录,找到文件名中包含了指定字符的文件,并提示用户是否要删除这个文件。根据用户的输入决定是否删除。
public static void main(String[] args) throws IOException {
// 1.让用户指定一个待扫描的根目录 和 要查询的关键词
System.out.println("请输入要扫描的根目录(绝对路径):");
Scanner scanner = new Scanner(System.in);
String root = scanner.next();
File rootDir = new File(root);
if(!rootDir.isDirectory()){
System.out.println("你输入的路径错误!程序直接退出");
return;
}
System.out.println("请输入要查找的文件名中包含的关键词:");
String token = scanner.next();
// 2.递归的遍历目录
// result表示递归遍历的结果,就包含着所有带有token关键词的文件名
List<File> result = new ArrayList<>();
scanDir(rootDir,token,result);
// 3.遍历result,问用户是否要删除该文件,根据用户的输入决定是否删除。
for (File f: result) {
System.out.println(f.getCanonicalPath()+"是否要删除?(Y/n)");
String input = scanner.next();
if(input.equals("Y")){
f.delete();
}
}
}
// 递归的来遍历目录,找出里面所有符合条件的文件
private static void scanDir(File rootDir, String token, List<File> result) throws IOException {
// list返回的是一个文件名(String),使用listFiles直接得到的是File对象,用起来更方便一起
File[] files = rootDir.listFiles();
if(files == null || files.length == 0){
// 当前的目录是一个空的目录
return;
}
for(File f:files){
if(f.isDirectory()){
// 如果当前的文件是一个目录,就递归的进行查找
scanDir(f,token,result);
}else {
// 如果当前文件是一个普通的文件,就判定这个文件是否包含了待查找的关键词
if(f.getName().contains(token)){
result.add(f.getCanonicalFile());
}
}
}
}
二:复制一个文件,启动程序之后,让用户输入一个文件的路径(绝对路径)要求这个文件是一个普通文件,不是目录。然后在指定一个要复制过去的目标目录,通过程序,把这个文件给进行复制。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要复制的文件:(绝对路径)");
String srcPath = scanner.next();
File srcFile = new File(srcPath);
if(!srcFile.isFile()){
System.out.println("文件路径错误!程序直接退出");
return;
}
System.out.println("请输入要复制到的目标路径:(绝对路径)");
String destPath = scanner.next();
//要求这个 destFile必须不能存在
File destFile = new File(destPath);
if(destFile.exists()){
System.out.println("目标文件的路径已经存在!程序直接退出!");
return;
}
if(!destFile.getParentFile().exists()){
// 父级目录不存在,也提示一个报错,也可以不存在就创建出来。使用mkdirs就能创建
System.out.println("目标文件的父目录不存在!程序直接退出!");
return;
}
// 具体进行复制操作
// 复制操作就是打开待复制的文件,读取出每个字节,然后再把这些字节给写入到目标的文件中
try(InputStream inputStream = new FileInputStream(srcFile);
OutputStream outputStream = new FileOutputStream(destFile)){
// 从inputStream中按照字节来读,然后把结果写入到outputStream中
while(true){
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
if(len == -1){
break;
}
outputStream.write(buffer,0,len);
}
// 如果这里不加flush,触发close操作,也会自动刷新缓冲区
outputStream.flush();
}catch (IOException e){
e.printStackTrace();
}
System.out.println("复制完成!");
}
- 只有实现了Closeable接口的才能放在try( )里面
通过文件操作,在指定目录中按照文件名和文件内容查看,看是否有匹配的文件
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 1.让用户输入一个路径,待搜索的路径
System.out.println("请输入要扫描的根目录:");
String rootDir = scanner.next();
File rootFile = new File(rootDir);
if(!rootFile.isDirectory()){
System.out.println("该目录不存在或者不是文件!字节退出");
}
// 2.再让用户输入一个查询词,表示要搜索的结果中要包含这个词
System.out.println("请输入要查询的词:");
String query = scanner.next();
// 3.遍历目录以及文件,进行匹配
List<File> results = new ArrayList<>();
scanDirWithContent(rootFile,query,results);
}
private static void scanDirWithContent(File rootFile, String query, List<File> results) {
File[] files = rootFile.listFiles();
if(files == null || files.length == 0){
// 针对空的目录,字节返回
return;
}
for (File f:files){
if(f.isDirectory()){
scanDirWithContent(f,query,results);
}else {
if(f.getName().contains(query)){
// 看看文件名称中是否包含
results.add(f);
} else if(isContentContains(f,query)){
// 看看文件内容中是否包含
results.add(f);
}
}
}
}
private static boolean isContentContains(File f, String query) {
// 打开f这个文件,依次取出每一行结果,去和query来进行一个indexof
StringBuilder stringBuilder = new StringBuilder();
try(InputStream inputStream = new FileInputStream(f)){
Scanner scanner = new Scanner(inputStream,"UTF-8");
while (scanner.hasNextLine()){
String line = scanner.nextLine();
stringBuilder.append(line+"\n");
}
}catch (IOException e){
e.printStackTrace();
}
// 只要结果不等于 -1,就说明查到了
return stringBuilder.indexOf(query) != -1;
}