提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
基于上一篇学过Io操作的基础应用
提示:以下是本篇文章正文内容,下面案例可供参考
一、查找指定的文件
扫描指定的目录,并找到名称中包含字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
思路:
1.先让用户输入:要扫描的路径+你要查找的词
2.遍历目录,找到名字匹配的文件
3.询问用户是否删除
程序:
package io_0929;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class demo6 {
public static void main(String[] args) throws IOException {
// 1.让用户输入必要的信息
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要扫描的路径: ");
File rootDir=new File(scanner.next());
if(!rootDir.isDirectory()){
System.out.println("你输入的目录不存在!");
}
System.out.println("请输入要搜索的关键词: ");
String toDelete=scanner.next();
//2.遍历目录,需要借助一个核心方法,listFile()
scanDir(rootDir,toDelete);
}
//借助这个方法进行递归遍历
private static void scanDir(File rootDir,String toDelete) throws IOException {
System.out.println("当前访问: "+rootDir.getCanonicalPath());
File[]files=rootDir.listFiles();
//说明rootDir是一个空的目录
if(files==null) {
return;
}
//如果目录非空,则循环遍历每个元素
for(File f:files){
if(f.isDirectory()){
scanDir(f,toDelete);
}else{
//不是目录,普通文件,判断文件名是否符合要求,是否要进行删除
checkDelete(f,toDelete);
}
}
}
private static void checkDelete(File f,String toDelete){
if(f.getName().contains(toDelete)){
System.out.println("该单词 "+toDelete);
Scanner scanner=new Scanner(System.in);
String choice=scanner.next();
if(choice.equals("Y")||choice.equals("y")){
f.delete();
}
}
}
}
listFiles():
能够把当前目录里的文件和子目录列举出来,但是这个方法,只能列出一层,没法直接列出子目录中的子目录
二、进行普通文件的复制
把第一个文件打开,把里面的内容逐个字节的读取出来,写入到第二个文件即可
(使用字节流来进行操作,字节流也是可以用来拷贝文本文件)
Scanner scanner = new Scanner(System.in);
System.out.println("请输入源文件: ");
//srcFile 形如d:/cat.flg
File srcFile = new File(scanner.next());
System.out.println("请输入目标文件");
//destFile 形如 d:/cat2.jpg
if (!srcFile.isFile()) {
System.out.println("输入的源文件有误");
return;
}
File destFile = new File(scanner.next());
if (!destFile.getParentFile().isDirectory()) {
System.out.println("输入的目标文件有误!");
return;
}
//2.打开源文件,按照字节读区内容,一次写入到目标文件中
try (InputStream inputStream = new FileInputStream(srcFile);
OutputStream outputStream = new FileOutputStream(destFile)) {
//读src的每个字节,写入到dest中
while (true) {
int ret = inputStream.read();
if (ret == -1) {
break;
}
outputStream.write(ret);
}
} catch (IOException e) {
e.printStackTrace();
}
}
三.查找指定文件或者内容包含指定字符文件
第一个代码的进阶版,第一个代码是判定文件名是否包含关键词,现在还要判断内容是否包含
、
public static void main(String[] args) throws IOException {
//1.输入路径和要查询的关键词
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要扫描的路径 ");
File rootDir=new File("请输入要查询的词: ");
String toFind=scanner.next();
//2.递归扫描的目录
scanDir(rootDir,toFind);
}
private static void scanDir(File rootDir,String toFind) throws IOException{
File[]files=rootDir.listFiles();
if(files==null){
return;
}
for(File f:files){
if(f.isDirectory()){
scanDir(f,toFind);
}else{
checkFile(f,toFind);
}
}
}
private static void checkFile(File f,String toFind) throws IOException{
//1.先检查文件名
if(f.getName().contains(toFind)){
System.out.println(f.getCanonicalPath()+" 文件名中包含 "+ toFind);
}
//2.再检查文件内容
try(InputStream inputStream=new FileInputStream(f)) {
StringBuilder stringBuilder=new StringBuilder();
Scanner scanner=new Scanner(inputStream);
//这个地方需要按行读取了
while(scanner.hasNextLine()){
stringBuilder.append(scanner.nextLine()+"\n");
}
if(stringBuilder.indexOf(toFind)>-1){
System.out.println(f.getCanonicalPath()+"文件内容包含 "+toFind);
}
}
}
注意:stringbuilder.indexof()返回指定字符串第一次出现的下标,如果没有出现返回-1;