IO流学习笔记
最近学习了一下java的io流,自己做了一点小总结
IO流的划分
根据流的方向分:
输出流 InputStream 、 Reader
输入流 OutputStream 、Writer
根据流的单位分:
字节流:InputStream 、OutputStream
字符流:Reader 、Writer
根据流的功能分:
节点流(低级流):能够直接操作源的流(构造方法可以直接写文件路径的)
处理流(高级流):不能直接操作源的流,但是有特定的功能
BufferedReader:可以一行一行读取数据,拥有readLine()
BufferedWriter:可以换行输出,拥有newLine()
高级流和低级流
高级流和低级流都是对文件的操作,都一样的具有read()读文件数据和write()写数据到文件。
高级流能够处理低级流处理不了的事务,但是也是一样具有读和写的方法,但是可以写入任何的对象,也可以读出任何的对象。
低级流之间的区别
两个低级流之间的区别就只是在于流的单位,一个是byte级别,一个是char级别的。
FileInputStream 和 FileOutputStream : 适用于复制、拷贝文件(特别是多媒体文件)
FileReader 和 FileWriter : 适用于修改文本文档的内容,获取到的是char字符,容易进行操作
高级流和低级流的操作
所有的IO流都是一样,都是一样需要new出来。
低级流就直接在构造函数里放文件路径,高级流new出来就要在构造函数里放低级流的对象,毕竟高级流不能直接访问源,但是可以通过传入低级流间接访问和操作流。
不管是高级流还是低级流,都要加上finlly关键字来关闭资源。
不管是高级流还是低级流,把数据写入文件之后,都要调用flush()方法,将暂存区的数据强制输出到文件中。
但是从文件读出数据就不需要也没有fluch()这个方法。
对象序列化和反序列化
- 所有需要序列的对象,必须实现序列化接口Serializable或Externalizable接口
- 如果有父类实现序列化接口,子类可以不用再实现
- 如果属性不需要被序列化,可使用transient关键字修饰
(例如:private transient int age;//transient 隐藏属性,不被序列化)
序列化思路
1、 先实例化对象(或者是把对象传过来)
2、 New一个节点流,指明要存放对象的文件
3、 实例化处理流,将节点流放到处理流里,节点流开始调用write()方法写入文件
4、 刷新处理流,关闭处理流。
反序列化思路
1、 new一个节点流,指明要读取的文件
2、 实例化处理流,将节点流放到处理流的构造函数中,节点流调用read()方法读取文件数据
3、 对象接收处理流读出来的数据(对象读出来的数据是Object类型的,但是可以下朔成对象的类型,因为序列化的时候,对象上朔成Object类型)
4、 关闭处理流
总结
首先都要先指明要操作的文件
不管是低级流还是高级流,都需要new出来,低级流调用构造函数就直接把文件的路径加上,指明要操作的文件。
而高级流必须通过传入低级流才能进行操作。
高级、低级流的操作都是read()和write()两个方法。
还请个位大神给我这个准备实习的小白指教指教
写给自己的话:第一次写博客,有点小兴奋。希望可以在后面学到更多的东西吧。一分耕耘一分收获,耕耘多少收获多少。2020届的小白希望能找到一份合心意的java开发工作。