流 | 输入 | 输出 |
---|---|---|
字节 | InputStream | OutputStream |
字符 | Reader | Writer |
IO流是Java用于传输数据的一套API, 从方向上可以分为输入流和输出流;从类型上可以分为字符流和字节流
输入流是指数据从外部流向程序,输出流是指数据从程序流向外部。四个基本流都是抽象类.
读取文件---数据从文件读取到程序中---输入流
向文件中写入一段数据---数据从程序流向文件---输出流
流的异常处理
- 将流对象放到try之外定义并且赋值为null,放到try之内初始化
- 在关流之前需要判断流对象是否初始化成功---判断流对象是否为null
- 关流之后需要将流对象置为null
- 需要在写完数据数据之后手动冲刷缓冲区以防关流失败有数据死在缓冲区中
PS:从TXT文件读取数据 --- 字符流、输入流 FileReader
缓冲流
字符输出流在输出的时候有缓冲区存在,输入流没有,字节流也没有
在构建BufferedReader对象的时候需要传入一个Reader对象,底层读取数据靠的是传入的Reader对象,BufferedReader提供了缓冲区。---这种方式称之为装饰设计模式
合并流:SequenceInputStream
用于合并多个字节流的。在构建合并流对象的时候,需要传入Enumeration对象,利用了Vector中的elements()来获取这个Enumeration对象。
转换流
提供了字符流和字节流之间的相互转换。
OutputStreamWriter:将字符流转化为字节流。
InputStreamReader:将字节流转化为字符流
系统流/标准流
系统流都是字节流,本质上是静态对象,一旦关闭就无法使用,所以系统流在使用的时候一般不用关闭
System.in 标准输入流
System.out 标准输出流
System.err 标准错误流
打印流
PrintStream/PrintWriter--- 能够便捷的向外输出数据
序列化/反序列化流
将对象进行存储的过程就称之为序列化 --- 将对象保存到硬盘上就叫持久化
将对象还原回来的过程就称之为反序列化
注意:
- 一个对象如果想要被序列化,那么要求这个对象对应的类必须实现一个接口---Serailizable --- 仅仅用于标志实现这个接口的类的对象允许被序列化
- 被static/transient修饰的属性不能被序列化
- 需要在类中手动指定一个属性---serialVersionUID---版本号。当一个对象序列化出去的时候会携带这个类的版本号,在反序列化的时候会检查对象携带的版本号和类中定义的版本号是否一致,如果一致则允许被反序列化。如果一个类中没有手动指定版本号,那么Java在编译的时候会根据当前类中的属性和方法自动计算产生一个版本号。也就意味着类中的属性或者方法产生变动,版本号就会改变。---因此需要手动指定,一旦手动指定就不再变化了。---版本号默认用private static final long 修饰限定
- 在Java中数组和集合中的元素以及大部分的映射不能随着集合或者映射一起序列化
网友评论