侧边栏壁纸
博主头像
快乐江湖的博客博主等级

更多内容请点击CSDN关注“快乐江湖”

  • 累计撰写 127 篇文章
  • 累计创建 33 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

第十八章第一节:Java之文件系统操作(Java.io.File)

快乐江湖
2023-04-30 / 0 评论 / 0 点赞 / 20 阅读 / 12921 字

本小节内容主要目的是让Java可以操控系统中的目录或文件,完成如新建、删除、重命名等操作

一:Java.io.File

(1)概述

Java.io.File:在Java中,是通过Java.io.File类来对一个文件(或目录)进行抽象描述的

File属性

File构造方法

  • 注意File file = new File()并不要求该文件必须真实存在

File方法

(2)示例

示例1:分别传入一个文件的相对路径和绝对路径,然后构造File对象f_relativef_absolute,测试getParent()getName()getPath()getAbsolutePath()getCanonicalPath()

  • 注意1:下面的test.txt我并没有真实创建
  • 注意2:使用相对路径时,.指的是基准路径
import java.io.File;
import java.io.IOException;

public class TestDemo {
    public static void main(String[] args) throws IOException {
        // 分别给定相对路径和绝对路径
        File f_relative = new File("./test.txt");
        File f_absolute = new File("F:/RenataReaction/VcKlmentor/FIleOperation//src//test.txt");

        // 使用相对路径
        System.out.println("返回File对象所在目录路径:" + f_relative.getParent());
        System.out.println("返回File对象文件名称:" + f_relative.getName());
        System.out.println("返回File对象文件路径:" + f_relative.getPath());
        System.out.println("返回File对象绝对路径:" + f_relative.getAbsolutePath());
        System.out.println("返回File对象修饰过的绝对路径:" + f_relative.getCanonicalPath());

        // 使用绝对路径
        System.out.println("--------------------------------------------------------------------");
        System.out.println("返回File对象所在目录路径:" + f_absolute.getParent());
        System.out.println("返回File对象文件名称:" + f_absolute.getName());
        System.out.println("返回File对象文件路径:" + f_absolute.getPath());
        System.out.println("返回File对象绝对路径:" + f_absolute.getAbsolutePath());
        System.out.println("返回File对象修饰过的绝对路径:" + f_absolute.getCanonicalPath());
    }
}

示例2:对test.txt进行判断,包括exists()是否存在、isDirectory()是否是一个目录、isFile()是否是一个普通文件

public class TestDemo2 {
    public static void main(String[] args) {
        File f = new File("./test.txt");
        // 判断文件是否存在
        System.out.println(f.exists());
        // 判断是否是目录
        System.out.println(f.isDirectory());
        // 判断是否是普通文件
        System.out.println(f.isFile());
    }
}

然后使用creatNewFile()创建文件,再进行判断

import java.io.File;
import java.io.IOException;

public class TestDemo2 {
    public static void main(String[] args) throws IOException {
        File f = new File("./test.txt");
        // 判断文件是否存在
        System.out.println(f.exists());
        // 判断是否是目录
        System.out.println(f.isDirectory());
        // 判断是否是普通文件
        System.out.println(f.isFile());

        // 把test.txt创建出来
        f.createNewFile();
        System.out.println("-------------------------------------------------");
        // 判断文件是否存在
        System.out.println(f.exists());
        // 判断是否是目录
        System.out.println(f.isDirectory());
        // 判断是否是普通文件
        System.out.println(f.isFile());
    }
}


最后使用delete()删除文件,再进行判断

import java.io.File;

public class TestDemo3 {
    public static void main(String[] args) {
        File f = new File("./test.txt");
        System.out.println(f.exists());
        // 删除文件
        f.delete();
        System.out.println(f.exists());

    }
}

示例3:使用mkdir创建File对象所描述的目录

import java.io.File;

public class TestDemo4 {
    public static void main(String[] args) {
        File f = new File("./testDir");
        f.mkdir();
        System.out.println(f.isDirectory());

    }
}


使用mkdirs创建File对象所描述的多级目录

import java.io.File;

public class TestDemo4 {
    public static void main(String[] args) {
        File f = new File("./testDir1/testDir2/testDir3");
        f.mkdirs();
    }
}


示例5:使用renameTo完成文件重命名

import java.io.File;
import java.io.IOException;

public class TestDemo5 {
    public static void main(String[] args) throws IOException {
        File srcFile = new File("./aaa.txt");
        File destFile = new File("./bbb.txt");
        srcFile.createNewFile();
        if (srcFile.exists() == true)
            System.out.printf("aaa.txt已存在");
        srcFile.renameTo(destFile);
    }
}


示例6:使用list列出File对象所表示目录下的所有文件名,返回类型为String[]

import java.io.File;
import java.util.Arrays;

public class TestDemo6 {
    public static void main(String[] args) {
        File f = new File("./");

        String[] results = f.list();
        System.out.println(Arrays.toString(results));
    }
}

二:程序案例

接下来我们就是用Java结合上面所学知识做一些小案例,实现一些有关对文件系统管理的小功能

(1)案例1

案例1:扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),然后询问用户是否需要删除该文件

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public class TestDemo13 {
    public static void main(String[] args) throws IOException {
        // 用户输入信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入待删除的目录路径:");
        File rootDir = new File(scanner.next());
        if (rootDir.exists()) {
            if (rootDir.isDirectory()) {
                System.out.println("待删除目录为:" + rootDir.getCanonicalPath());
            } else {
                System.out.println("错误!不是目录");
            }
        } else {
            System.out.println("错误!该目录不存在");
        }
        System.out.println("请输入待删除关键字:");
        String toDelete = scanner.next();

        scanner.close();
        // 开始遍历目录
        scanDir(rootDir, toDelete);
    }
    private static void scanDir(File rootDir, String toDelete) throws IOException {
        System.out.println("当前访问目录为:" + rootDir.getCanonicalPath());
        File[] files = rootDir.listFiles();

        if (files == null) {
            // 说明目录为空
            return;
        }
        // 如果目录不空,则遍历该目录
        for (File f : files) {
            if (f.isDirectory()){
                // 如果f还是一个目录则再次遍历
                scanDir(f, toDelete);
            } else {
                // 如果是一个普通文件则判断是否满足删除条件
                checkAndDelete(f, toDelete);
            }
        }
    }

    private static void checkAndDelete(File f, String toDelete){
        if (f.getName().contains(toDelete)){
            System.out.println("文件" + f.getName() + "中包含" + toDelete + ", 是否删除(y/n)?");
            Scanner scanner = new Scanner(System.in);
            String choice = scanner.next();
            if (choice.equals("y") || choice.equals("n")){
                f.delete();
            }
        }
    }
}

(2)案例2

案例2:实现普通文件的复制

import java.io.*;
import java.util.Scanner;

public class TestDemo14 {
    public static void main(String[] args) {
        // 输入源文件和目标文件
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入源文件");
        File srcFile = new File(scanner.next());
        System.out.println("请输入目标文件");
        File destFile = new File(scanner.next());

        if (srcFile.exists()) {
            if (!srcFile.isFile()) {
                // 不是普通文件
                System.out.println("源文件非普通文件请重新输入!");
                return;
            }
        } else {
            System.out.println("源文件不存在");
            return;
        }

        if (!destFile.getParentFile().isDirectory()) {
            // 如果目标文件的目录不存在报错
            System.out.println("目标文件目录不存在");
            return;
        }

        // 打开源文件按照字节读取内容然后再写入到目标文件中去
        try(InputStream inputStream = new FileInputStream(srcFile);
            OutputStream outputStream = new FileOutputStream(destFile)) {
            while (true) {
                int ret = inputStream.read();
                if (ret == -1){
                    break;
                }
                outputStream.write(ret);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

(3)案例3

案例3:扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class TestDemo15 {
    public static void main(String[] args) throws IOException {
        // 输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入扫描路径:");
        File rootDir = new File(scanner.next());
        String toFind = scanner.next();

        // 扫描
        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 {
        // 检查
        if (f.getName().contains(toFind)) {
            System.out.println(f.getCanonicalFile() + "文件中包含 " + toFind);
        }
        // 检查文件内容
        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);
            }
        }

    }
}
0

评论区