JavaEE 初阶第十七期:文件 IO 的 “管道艺术”(下)

发布于:2025-08-12 ⋅ 阅读:(18) ⋅ 点赞:(0)

专栏:JavaEE初阶起飞计划

个人主页:手握风云

目录

一、Java文件内容写入

1.1. OutputStream

二、字符流读取和写入

2.1. Reader

2.2. Writer

三、示例练习

3.1. 查找文件功能


一、Java文件内容写入

1.1. OutputStream

        OutputStream同样只是⼀个抽象类,要使用还需要具体的实现类。我们现在还是只关⼼写入文件中,所以使用FileOutputStream。int参数类型是写入要给字节的数据;byte[]参数类将b这个字符数组中的数据全部写⼊os中。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Demo1 {
    public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("./test.txt")) {
            // “你好”的字符编码
            outputStream.write(0xe4);
            outputStream.write(0xbd);
            outputStream.write(0xa0);
            outputStream.write(0xe5);
            outputStream.write(0xa5);
            outputStream.write(0xbd);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

        但上面写的代码,每次打开文件,都会清空原有的内容,我们可以在write方法后面加一个参数append,就能从文件末尾追加内容。

二、字符流读取和写入

2.1. Reader

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Demo3 {
    public static void main(String[] args) {
        try (Reader reader = new FileReader("./test.txt")) {
            while (true) {
                int ch = reader.read();
                if (ch == -1) {
                    break;
                }
                char c = (char) ch;
                System.out.println(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

        我们同样也可以使用字符数组来进行读取。

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Demo3 {
    public static void main(String[] args) {
        try (Reader reader = new FileReader("./test.txt")) {
            while (true) {
                char[] chars = new char[1024];
                int c = reader.read(chars);
                if (c == -1) {
                    break;
                }
                for (int i = 0; i < c; i++) {
                    System.out.println(chars[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.2. Writer

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Demo4 {
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("./test.txt")) {
            writer.write("你好世界");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、示例练习

3.1. 查找文件功能

        扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问⽤户是否要删除该文件。

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

public class Demo5 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入要搜索的目录:");
        String dir = in.nextLine();
        System.out.println("请输入要查询的文件名:");
        String filename = in.nextLine();

        // 判断目录是否存在
        File rootFile = new File(dir);
        if (!rootFile.isDirectory()) {
            System.out.println("目录不存在!");
            return;
        }

        // 利用递归进行搜索
        searchFile(rootFile, filename);
    }

    private static void searchFile(File rootFile, String filename) {
        // 列出rootFile中的内容
        File[] files = rootFile.listFiles();
        if (files == null) {
            // 空目录
            return;
        }

        // 遍历files数组,判断元素类型
        for (File file : files) {
            if (file.isDirectory()) {
                searchFile(file, filename);
            } else if (file.isFile()) {
                if (file.getName().contains(filename)) {
                    tryDel(file);
                }
            }
        }
    }

    private static void tryDel(File file) {
        System.out.println("准备删除文件:" + file.getAbsolutePath());
        Scanner in = new Scanner(System.in);
        System.out.println("是否确认删除?(Y/N)");
        String choice = in.nextLine();
        if (choice.equalsIgnoreCase("Y")) {
            file.delete();
            System.out.println("删除成功");
        } 
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到