计算机本质上存储都是通过字节进行存储数据,为什么要有字节流跟字符流呢
字符流是方便我们进行操作,使之变成我们看得懂的东西,所以才有字符流
字节流的顶级父类 输入流为InputStream 输出流为OutputStream
字符流的顶级父类 输入流为Reader 输出为Writer
数据追加续写可以在创建io流的后面boolean append有个参数 填入true即可开启续写
命名规则 其实都是在顶级父类前面加上一些特定的操作类型
比如 FileOutputStream 就是操作文件的输出流
读取的时候
如果是一个一个读取那么返回值就是int类型 如果读取不到将返回-1
如果是按照数组去读取的话,那么如果读取不到返回的是null
用到流的时候再去创建相应的流 不然有时候会重置文件
最后结束的时候记得关流 先开启的后关闭
关于缓冲区的 其实本质上就是一个数组
速率更快的就是底层读取写入的时候是一个数组一个数组进行搬运数据 所以速率更快
缓冲区中 我们如果还要后续继续写入那我们就应该通过flush方法去把缓冲区清空 这样才能确保我们的数据被接收
如果后续不写入了 直接close关流即可 关流的时候会有先调用flush方法然后在关流
字符流才有flush方法
还要记住缓冲流的特殊方法
即newLine()`: 写一行行分隔符,由系统属性定义符号。
readLine()`: 读一行文字。
转换流 InputStreamReader OutputStreamWriter
其实就是字符编码和字符集 可以让我们按照指定的编码格式去进行读取写入
序列化与反序列化ObjectInputStream ObjectOutputStream
一个对象要想序列化,必须满足两个条件:
该类必须实现java.io.Serializable
接口
该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient
关键字修饰。意思就是如果不让io流去操作这个属性 我们就用transient`去修饰他一下
需要注意的还有序列号 如果序列号不同的话 是会报异常的
所以就需要去让序列号不可被改变
private static final long serialVersionUID = 1L;