阿嘉的Java日志 [第八章:IO流]

139 阅读2分钟

IO流

[内容时间:2021.08.24]

Java IO流四大类

四大家族的首领

java.io.InputStream  //字节输入流
java.io.OutputStream //字节输出流
​
java.io.Reader      //字符输入流
java.io.Writer      //字符输出流

需要学习的流

java.io包下需要掌握的流有16个:

//文件专属:
    java.io.FileInputStream(掌握)
    java.io.FileOutputStream(掌握)
    java.io.FileReader
    java.io.FileWriter
​
//转换流:(将字节流转换成字符流)
    java.io.InputStreamReader
    java.io.OutputStreamWriter
​
//缓冲流专属:
    java.io.BufferedReader
    java.io.BufferedWriter
    java.io.BufferedInputStream
    java.io.BufferedOutputStream
​
//数据流专属:
    java.io.DataInputStream
    java.io.DataOutputStream
​
//标准输出流:
    java.io.PrintWriter
    java.io.PrintStream(掌握)
​
//对象专属流:
    java.io.ObjectInputStream(掌握)
    java.io.ObjectOutputStream(掌握)

Object对象流

  • 序列化和反序列化

    序列化

    若要将一个对象输出到硬盘保存,则需要将对象“拆分”成一块块,按顺序放入硬盘。(因为有的对象太大所以不能一次性输出 于是有了序列化)

    对象在序列化时要实现一个Serializable 接口,JVM会给这个对象自动生成一个序列版本号

    注意一下, 带有transient 的变量不参与序列化。

    反序列化

    将程序重新输入回内存。

    若原对象的源代码在序列化之后有过改动,则不能反序列化回到内存。因为重新改动代码编译过的对象,JVM会重新给这个对象分配一个全新的序列号。序列号不同,无法反序列化。

    所以这时我们需要手动去给此对象手写一个序列号。

建议手动把序列版本号写出来,这样改代码,以后这个对象反序列化还能编译通过

private static final long serialVersionUID = 数字L(长整型long类型)

文件夹的复制

IO + Properties 的联合使用

  • 非常好的一个设计理念:

    以后经常改变的数据,可以单独写到一个文件中,使用程序动态读取。将来只需要修改这个文件的内容,Java代码不需要改动,不需要重新编译,服务器也不需要重启,就可以拿到动态的信息

    类似以上机制的这种文件被称为配置文件

    并且当配置文件的内容格式是:

    • key1=value 冒号 : 也可以隔开,不建议
    • key2=value 这个格式最好不要有空格 在框架做项目如果呆空格可能会出问题

    的时候,我们把这种配置文件叫做属性配置文件

    java规范中有要求:属性配置文件建议以 .properties结尾,但不是必须的

    这种以 .properties结尾的文件在java中被称为属性配置文件

    其中Properties是专门存放属性配置文件内容的一个类

    属性配置文件中,#井号是注释

    key重复的话,value自动覆盖。文件中也会有红色下划线(IDEA太强大了!)