一、文件基础知识
1.文件流
![](https://img-blog.csdnimg.cn/direct/fa231fb5808d4d41b19fb0295205def4.png)
![](https://img-blog.csdnimg.cn/direct/355510ba25154f87a2593884bda50cee.png)
2.常用文件操作
3.IO流原理及流的分类
抽象基类
|
字节流
|
字符流
|
输入流
|
InputStream
|
Reader
|
输出流
|
OutputStream
|
Writer
|
二、节点流
1、字节输入流-InputStream
该抽象类是所有类字节输入流的超类。
1.常用子类
①FileInputStream:文件输入流
②BufferedInputStream:缓冲字节输入流
③ObjectInputStream:对象字节输入流
2.FileInputStream:
构造方法:
方法:
2、字节输出流-OutputStream:
该抽象类是所有类字节输入流的超类。
1.常用子类
①FileOutputStream:文件输出流
②BufferedOutputStream:缓冲字节输出流
③ObjectOutputStream:对象字节输出流
2.FileOutputStream
构造方法:
方法:
3、字符输入流-Reader
按照字符输入。
1.常用子类
①FileReader:实际使用类
②InputStreamReader:字节流和字符流的桥接器。
Java中的InputStreamReader类是由InputStream类实现的。
InputStreamReader类是一个字符流读取器,它通过使用默认或指定的字符集将字节流转换为字符流。
它通过InputStream类来实现该功能,InputStream提供了读取字节的基本功能,而InputStreamReader则在此基础上实现了读取字符的功能。
InputStreamReader类是一个装饰器,它通过在InputStream上添加字符解码功能来扩展InputStream。
InputStreamReader类可以指定字符集,在读取文件时可以避免乱码问题。
所以InputStreamReader是由InputStream实现的,它是一个字符流读取器,可以将字节流转换为字符流。
③BufferedReader:处理流
2.FileReader
构造方法:
方法:
其自身没有普通方法,相关方法均来自继承的父类:
read():每次读取单个字符,返回该字符,如果到达文件末尾返回-1.
read(byte[]):批量读取多个字符,返回读取到的字符数,到文件末尾返回-1.
4、字符输出流-Writer
1.常用子类
①FileWriter:实际使用类
②OutputStreamWriter:字节流和字符流的桥接器
Java中的OutputStreamWriter类是一种字符流写入器,它通过使用默认或指定的字符集将字符流转换为字节流。
它通过OutputStream类来实现该功能。OutputStreamWriter 类可以将文本内容写入 OutputStream 中。
它是一个装饰器,它在 OutputStream 上添加了字符编码功能。OutputStreamWriter类可以指定字符集编码,在写文件时可以避免乱码问题。
所以OutputStreamWriter是由OutputStream实现的,它是一个字符流写入器,可以将字符流转换为字节流。
③BufferedWriter:
2.FileWriter
构造方法:
方法:
其自身没有普通方法,相关方法均来自继承的父类:
writer():写入单个字符
writer(char[]):写入指定字符
...
在写入完毕之后,必须使用close()或flush()方法,否则无法写入。
close()=flush() +关闭。
即flush()才是真正写入文件。
三、处理流
处理流:
1、节点流和处理流
1.节点流:
从一个特定的数据源读写数据,如FileReader、FileWriter。
(也就是说,直接对某个数据源进行操作,比如把其当作二进制FileInputStream,字符FileReader,
数组ByteArrayInputStream等,不进行过多的操作封装)
2.处理流(包装流):
是连接在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,例如BufferedReader,BufferedWriter。
3.二者区别:
①节点流是底层流\低级流,直接和数据源有关。
②处理流包装节点流,既可以消除不同节点流之间的差异,也可以提供更方便的方法来完成输入输出。
③处理流对节点进行包装,使用了 处理流设计模式——修饰器模式,不会直接与数据源相连。
处理流优势:
①性能的提高:主要以增加缓冲的方式提高输入输出效率。
②操作的便捷:处理流提供了一系列便捷的方法来一次输入大批量数据,使用起来更加灵活。
接下来分别介绍三种处理流:字符处理流、字节处理流、对象处理流
2、Buffered字符处理流
以下讲解最常见两种处理流BufferedReader和BufferedWriter,二者属于字符流。
1、BufferedReader
继承关系图:
1.属于字符流,按照字符来读取数据。
2.关闭处理流时,只需关闭外层流即可。(因为真正工作的还是节点流)
方法:
例如其中方法readLine()方法就是一个扩展方法。
为何只需关闭外部流即可:
1.可见该类有个属性in,用来存储字符流子类对象。
2.查看其close()方法:
直接调用了in.close(),说明自动调用了低一层的关闭方法。
2、BufferedWriter
继承关系图:
常用方法:
3、Buffered字节处理流
常用的为BufferedInputStream和BufferedOutputStream.
1.BufferedInputStream
继承关系图:
其父类FilterInputStream中也有一个属性为in:
作用与上述字符流一样。
常用方法:
BufferedOutputStream与这个类似。
4、对象处理流
常用的为ObjectInputStream和ObjectOutputStream.
引出对象处理流:
需要将基本数据类型或对象进行序列化和反序列化操作。
序列化和反序列化:
1.序列化就是在保存数据时,保存数据的值和数据类型。
2.反序列化就是在恢复数据时,恢复数据的值和数据类型。
3.需要让某个对象支持序列化机制,则必须让其类时可序列化的。为了让某个类是可序列化的,该类必须实现如下两个接口之一:
①Serializable(这是一个标记接口,没有方法)
②Externalizable(该接口继承了Serializable,其有两个方法)
继承关系图:
可见,根据其构造器,ObjectInputStream类也使用了修饰器模式。
ObjectOutputStream类似。
常用方法:
注意,序列化之后,保存的文件格式不是存文本。
注意事项:
1.读写顺序要一致,读取(反序列化)顺序需要和保存数据(序列化)顺序一致。
2.要求序列化或者反序列化的对象,需要实现上述的两个接口。
3.序列化的类中减一添加SerialVersionUID,为了提高版本的兼容性(即如果在类中添加了新的属性等,不会被认为是一个新的类)。
4.序列化对象,默认将除了static或transient修饰的属性以外的所有属性序列化。
5.序列化对象时,要求该类里面属性的类型也实现序列化接口。
6.序列化具备可继承性,如果某类实现了序列化,则它的所有子类也默认实现序列化。
四、IO流——标准输入输出流、转换流、打印流、配置文件
1、标准输入输出流
编译类型
|
实际类型
|
默认设备
| |
System.in 标准输入
|
InputStream
|
BufferedInputStream
|
键盘
|
System.out 标准输出
|
PrintStream
|
PrintStream
|
显示器
|
![](https://img-blog.csdnimg.cn/direct/aa2dccb8787e4637a9465f86836e77fb.png)
![](https://img-blog.csdnimg.cn/direct/6939a9420f7349eb8871504f1dc66077.png)
2、转换流
![](https://img-blog.csdnimg.cn/direct/caf1118aa1794b24b1ed964de5d0fa91.png)
![](https://img-blog.csdnimg.cn/direct/4c10b63d51204cfb9b85a1002ba7de75.png)
3、打印流
1. PrintStream字节打印流
![](https://img-blog.csdnimg.cn/direct/9d6b79c309e34aabb6cfdbf7a7408194.png)
![](https://img-blog.csdnimg.cn/direct/a1e616f807574c55846f2a4bf802d3dc.png)
![](https://img-blog.csdnimg.cn/direct/00d7a63b33b34ebaa97a98f57385588d.png)
2.PrintWriter字符打印流
![](https://img-blog.csdnimg.cn/direct/523f5ff55a224ec7a87e5f4166a9d48d.png)
![](https://img-blog.csdnimg.cn/direct/94ff0bd2eac6483d88e32ad55f4d4b9b.png)
4、配置文件Properties
![](https://img-blog.csdnimg.cn/direct/a8588454106345cc9ff86935aebc7788.png)
![](https://img-blog.csdnimg.cn/direct/bf1922ab12bd4b69b8473d924ddef3c9.png)