• 文件操作与IO


    文件

    概念

    文件,是储存在硬盘上面的,当硬盘储存数据时,不是全部数据直接储存,而是独立成一个个的单位来进行保存,这些单位就是文件.

    分类

    根据保存数据的不同,我们一般分为两种文件:

    1. 文本文件: 其内部保存的是被字符集编码的文本
    2. 二进制文件: 其内部保存的是按照标准格式的非字符集编码过的文本

    文件系统的结构组织

    整个文件系统,是呈树状组织
    在这里插入图片描述

    文件路径(path)

    在文件系统中,通过路径来定位一个文件的位置
    文件路径分为两类:

    1. 绝对路径:以盘符开头,从根部描述的路径, 例如:D:\java\CourseDesign
    2. 相对路径: 以 . 或 . .开头的,其中 . 表示当前路径 . . 表示当前路径的父目录(上级路径). 其中相对路径要有一个基准路径

    java中文件操作

    文件是被操作系统管理的,操作系统内核中有一个专门的模块,“文件系统”
    java对文件系统进行了一系列的封装.
    java中主要用 java.io.File 类来对一个文件进行描述, 但是即使有了File对象,也不一定代表该文件一定存在.

    绝对路径

    public static void main(String[] args) {
            //通过绝对路径定位
            File f1 = new File("D:/Test1.txt");
            // 获取父路径
            System.out.println(f1.getParent());
            // 获取文件名
            System.out.println(f1.getName());
            // 获取文件路径
            System.out.println(f1.getPath());
            // 获取绝对路径
            System.out.println(f1.getAbsolutePath());
            // 获取File 对象的修饰过的绝对路径
            System.out.println(f1.getAbsoluteFile());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行结果
    在这里插入图片描述

    相对路径

    在idea中运用相对路径创建file对象,并创建文件后, file对象文件会在当前项目的文件夹中.

    public static void main(String[] args) throws IOException {
            //通过绝对路径定位
            File f2 = new File("Test2.txt");
            f2.createNewFile();
            // 获取父路径
            System.out.println(f2.getParent());
            // 获取文件名
            System.out.println(f2.getName());
            // 获取文件路径
            System.out.println(f2.getPath());
            // 获取绝对路径
            System.out.println(f2.getAbsolutePath());
            // 获取File 对象的修饰过的绝对路径
            System.out.println(f2.getAbsoluteFile());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行结果
    在这里插入图片描述

    文件内容的读写

    根据文件的读写,java提供了标准的类

    1. 字节流对象,以字节为单位读写
      InputStream(读)
      OutputStream(写)
      2.字符流对象,以字符为单位读写
      Reader(读)
      Writer(写)

    上面所提到的都是抽象类,我们要使用这些类的子类
    1 FileInputStream
    2 FileOutputStream
    3 FileReader
    4 FileWriter

    文件内容操作步骤:

    1. 打开文件
    2. 读/写数据
    3. 关闭文件

    FileInputStream使用

    try 内打开文件,文件在try的内容执行完后会自动关闭.
    例如我们读取 Test.txt文件中的 hello
    在这里插入图片描述

    public static void main(String[] args) throws IOException {
            try(InputStream inputStream = new FileInputStream("Test2.txt")){
                byte[] b = new byte[1024];
                int len;
    
                while(true){
                    len = inputStream.read(b);
                    break;
                }
    
                for (int i = 0; i < len; i++) {
                    System.out.print(b[i]+" ");
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结果
    在这里插入图片描述

    利用Scanner读取

    在上述例子中, 我们看到对字符类型直接使用IntputStream 是麻烦的, 所以我们可以用我们熟悉的类,Scanner来完成.

    public static void main(String[] args) throws IOException {
            try(InputStream inputStream = new FileInputStream("Test2.txt")){
                try(Scanner scanner = new Scanner(inputStream)){
                    while(scanner.hasNext()){
                        String s = scanner.next();
                        System.out.print(s);
                    }
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    显示信息
    在这里插入图片描述

    FileOutputStream 使用

    在写数据的时候,会有一部分数据在缓冲区,我们需要调用.flush()方法将缓冲区清空.

    public static void main(String[] args) throws IOException {
            try(OutputStream outputStream = new FileOutputStream("Test2.txt")){
                outputStream.write('l');
                outputStream.write('i');
                outputStream.write('f');
                outputStream.write('e');
                outputStream.flush();
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    此时可见文件中的内容变成了 life
    但是在我们再次启动程序时,文件中的内容还是life,可见在输出的时候,会将文件中原有的数据清空, 如果想要追加数据, 我们需要在实例化时,多加一个参数, true.

    public static void main(String[] args) throws IOException {
            try(OutputStream outputStream = new FileOutputStream("Test2.txt",true)){
                outputStream.write('l');
                outputStream.write('i');
                outputStream.write('f');
                outputStream.write('e');
                outputStream.flush();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    当然,还可以整个数组输入:

    public static void main(String[] args) throws IOException {
            try(OutputStream outputSteam = new FileOutputStream("Test2.txt")){
                String s = "hello";
                byte[] b = s.getBytes();
                outputSteam.write(b);
                outputSteam.flush();
            }
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    显示结果
    在这里插入图片描述

    利用PrintWriter读取

    因为OutputStream为字节流,所以在输出字符的时候有许多的不方便,我们可以将OutputStream处理一下, 借助PrintWriter来输出
    PrintWriter有熟悉的println,print,printf方法

    public static void main(String[] args) throws IOException {
            try(OutputStream outputStream = new FileOutputStream("Test2.txt")){
                try(PrintWriter writer = new PrintWriter(outputStream)){
                    writer.println("你好");
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    显示结果
    `

  • 相关阅读:
    Linux 优先级 环境变量 命令行参数
    Ubuntu20.4安装QT6
    Linux学习记录——이 基本指令(2)
    kubeflow核心功能
    如何使用向导创建Openflow 流表-网络测试仪实操
    解决 Spark2.X 查询Hive分区表修改后的字段为null?
    flutter 命令
    后台管理系统加水印(react)
    口罩问题
    CycleGAN模型之Pytorch实战
  • 原文地址:https://blog.csdn.net/m0_62476684/article/details/126353023