一、文件基础知识
1.文件流
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
|
显示器
|
2、转换流
3、打印流
1. PrintStream字节打印流
2.PrintWriter字符打印流
4、配置文件Properties

4152

被折叠的 条评论
为什么被折叠?



