提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
基于上一篇学过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;