• Java学习之路 —— IO、特殊文件


    1. I/O

    1.1 常用API

    // 1. 创建文件对象
            File file = new File("E:\\ComputerScience\\java\\IO\\test.txt");
    
            // 2. 是否存在路径
            System.out.println(file.exists());
            // 3. 判断是否是文件
            System.out.println(file.isFile());
            // 4. 判断是否是文件夹
            System.out.println(file.isDirectory());
            // 5. 获取文件的名称(包括后缀)
            System.out.println(file.getName());
            // 6. 获取文件大小
            System.out.println(file.length());
            // 7. 获取文件最后修改时间
            System.out.println(file.lastModified());
            // 8. 获取创建文件对象时,使用的路径
            System.out.println(file.getPath());
            // 9. 获取绝对路径
            System.out.println(file.getAbsolutePath());
            
    		File[] files = file.listFiles();
    		        for (File file : files) {
    		            System.out.println(file);
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    1.2 I/O流

    • I称为输入流:负责把数据读到内存中去
    • O称为输出流:负责写数据出去

    按流中数据的最小单位:

    • 字节流:适合操作所有类型的文件
      • 字节输入流:InputStream
      • 字节输出流:OutputStream
    • 字符流:只适合操作纯文本文件
      • 字符输入流:Reader
      • 字符输出流:Writer

    1.2.1 字节流

    FileInputStream
    把磁盘文件中的数据以字节的形式读入到内存中去。
    在这里插入图片描述

    FileOutputStream
    在这里插入图片描述

    1.2.2 try-catch-finally和try-with-resource

    finally是用于在程序执行完后进行资源释放的操作,即便出现了异常,也会执行finally的代码(专业级做法)

    IDEA的快捷键是ctrl + alt + t

    try {
       test4();
    } catch (Exception e) {
       e.printStackTrace();
    } finally {
       System.out.println("执行结束");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    try-with-resource是JDK7后有的,更加简洁,不需要写finally这个臃肿的代码块。即不需要我们去写一些close代码了,只需要在try的时候放到小括号里面。

    static void test4() throws Exception {
    		// 注意,括号里面只能放置资源对象
            try (
                    OutputStream os = new FileOutputStream("test2.txt", true);
            ) {
                byte[] bytes = "我爱你中国".getBytes();
                os.write(97);
                os.write(bytes);
                // 换行
                os.write("\r\n".getBytes());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.2.3 字符流

    字节流适合复制文件,但不适合读写文本文件;而字符流更适合读写文本文件内容。

    字符流读文件,会把每一个字母、函字看成一个字符,所以不会出现乱码的问题。

    FileReader(文件字符输入流)
    在这里插入图片描述

    static void test1() {
            try (
                    Reader fr = new FileReader("test.txt");
            ) {
                // 1. 一个一个的读取
    //            int c;  // 记住每次读取的字符编号
    //            while ((c = fr.read()) != -1) {
    //                System.out.print((char) c);
    //            }
                // 2. 读取多个字符
                int len;
                char[] buf = new char[3];
                while((len = fr.read(buf)) != -1) {
                    System.out.print(new String(buf, 0, len));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    FileWriter

    字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效!!!
    在这里插入图片描述

    1.2.4 其他的一些流

    还有一些其他的流,就不一一列举了。

    • 字节缓冲流
      • 作用:提高字节流读写数据的性能
      • 原理:字节缓冲输入流自带了8KB缓冲池,字节缓冲输出流自带了8KB缓冲池
    • 转换流InputStreamReader/OutputStreamWriter
      • 作用:解决不同编码时,字符流读取文本内容乱码的问题
      • 解决思路:先获取文件的原始字节流,再将其按照真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了
    • 打印流PrintStream/PrintWriter
      • 作用:可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去
    • 数据流DataInputStream/DataOutputStream
      • 允许把数据和其类型一并写出去
    • 序列化流
      • 对象序列化:把Java对象写入到文件中去
      • 对象反序列化:把文件里的Java对象读出来
      • 注意:对象如果要参与序列化,必须实现序列化接口(java.io.Serializable)

    2. I/O框架

    Commons-io是apache提供的一组有关IO操作的小框架,目的是提高IO流的开发效率。需要去Apache官网下载。
    在这里插入图片描述

    3. 特殊文件

    3.1. Properties

    • 是一个Map集合(Json类似)
    • 核心作用:Properties用来代表属性文件,通过Properties可以读写属性文件里的内容
      在这里插入图片描述
    public class Properties_Demo1 {
        public static void main(String[] args) throws Exception {
            // 1. 创建一个Properties对象
            Properties properties = new Properties();
            // 2. 加载属性文件的键值对到对象中
            properties.load(new FileReader("src\\users.properties"));
            System.out.println(properties);
            // 3. 根据键取值
            System.out.println(properties.getProperty("张无忌"));
            properties.forEach((k, v) -> {
                System.out.println(k + "  " + v);
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.2 XML

    • XML本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
    • 应用场景:经常用来作为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
    
    
    
    <users>
        <user id = "1">
            <name>JehanRioname>
            <sex>sex>
            <password>123456password>
        user>
        <user id = "2">
            <name>Bjergsenname>
            <sex>sex>
            <password>654321password>
        user>
    users>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    程序员的护城河
    token正确不报错,token失效后却出现报跨域错误
    PG 联表更新
    GLIP & DetCLIP
    WPF控件4
    SpringBoot集成webservice
    【实战】kubeadmin安装kubernetes集群
    数据库问题汇总
    uniapp——获取某元素距离顶部的距离,并将高度应用到css里面,为实现scroll-view内容而不让整个页面出现滚动条。
    HTTP 的前世今生
  • 原文地址:https://blog.csdn.net/weixin_51322383/article/details/134434484