9、IO
一、File类
1. 简介
java.io.File类表示磁盘上的文件或目录
-
无论是文件还是目录都通过File类来表示(目录是一种特殊的文件)
-
提供了对文件和目录的基本操作,如查看文件名、文件大小、新建或删除文件等
-
File类不能访问文件的内容,如果要访问文件内容,需要使用输入/输出流
2. 构造方法
路径分类:
-
绝对路径
以根开始的路径
Windows:盘符,如 D:\resource\a.txt
Linux/Mac:/正斜杠,如 /home/soft01/resource/a.txt
关于路径分隔符
Windows:使用\表示路径分隔符
Linux/Mac:使用/表示路径分隔符
由于在Java中\表示转义符,所以在Java中表示Windows路径时需要使用
\\或使用/表示路径分隔符 -
相对路径
不是以根开始的路径,相对于某个路径的路径
如 resource/a.txt
注:
.表示当前目录,..表示上一级目录
3. 常用方法
二、IO流
1. 简介
IO:Input Output 输入和输出流
-
通过IO流实现文件的输入和输出功能
-
用于对文件进行读写操作
流stream:可以理解为一组有顺序的、有起点和终点的动态数据集合
-
文件是数据在磁盘上的静态存储
-
流是数据在传输时的动态形态
2. 文件的分类
两类:
-
文本文件
可以使用记事本编辑的文件(
.txt,.properties,.java......) -
二进制文件
除了文本文件,其他所有文件都可以认为是二进制文件
3. 流的分类
三类:
-
按流的方向(站在Java程序的角度)
输入流:用于读取数据,比如从文件中读取数据到程序中,由InputStream和Reader作为父类
输出流:用于写出数据,比如将程序中的数据写到文件中,由OutputStream和Writer作为父类
-
按流中数据的单位
字节流byte:所操作的最小数据单元为字节,由InputStream和OutputStream作为父类
字符流char:所操作的最小数据单元为字符,由Reader和Writer作为父类
一个英文字符占1个字节,一个汉字占2个字节(GBK)或3个字节(UTF-8)
-
按数据的来源
节点流:直接对数据源进行操作,如操作文件
包装流:对一个节点流进行操作(包装)
| 字节流 | 字符流 | |
|---|---|---|
| 输入 | InputStream | Reader |
| 输出 | OutputStream | Writer |
三、字节流
1. 简介
InputStream是字节输入流的顶层父类,常用子类:
-
FileInputStream
-
ByteArrayInputStream
-
ObjectInputStream
OutputStream是字节输出流的顶层父类,常用子类:
-
FileOutputStream
-
ByteArrayOutputStream
-
ObjectOutputStream
2. 文件输入输出流
2.1 FileInputStream
文件字节输入流:以字节为单位,从文件中读取数据
2.2 FileOutputStream
文件字节输出流:以字节为单位,将数据写出到文件中
3. 字节数组输入输出流
流(数据)的来源或目的地并不一定是文件,也可以是内存中的一块空间,例如一个字节数组
3.1 ByteArrayInputStream
字节数组输入流:从字节数组中读取数据,即将字节数组当作流输入的来源
3.2 ByteArrayOutputStream
字节数组输出流:将数据写出到内置的字节数组中,即将字节数组当作流输出的目的地
4. 对象输入输出流
如果希望将Java对象写入到IO流中,或从IO流中读取Java对象,则要使用对象输入输出流,称为对象的序列化和反序列化
4.1 序列化和反序列化
序列化:将Java对象写入到IO流中,实现将对象保存在磁盘中或在网络中传输对象
反序列化:从IO流中读取Java对象,实现从磁盘或网络中恢复对象
要求:
-
对象必须实现Serializable接口,才能被序列化,转换成二进制流,通过网络进行传输
-
通过
serialVersionUID判断对象的序列化版本的一致性:在序列化时,对象(类)的serialVersionUID会被一并序列化为流
在反序列化时,会将流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较:
如果相同就认为版本一致,则可以进行反序列化
如果不相同,则会出现序列化版本不一致的异常 InvalidCastException
4.2 ObjectInputStream
对象输入流:用来读取对象,即反序列化
ObjectInputStream和ObjectOutputStream属于包装流
-
用于对节点流进行功能扩展 / 包装
-
在创建包装流时,需要传入要操作的节点流对象
-
当关闭流时,只需要关闭包装流即可,节点流也会被关闭
-
ObjectInputStream和ObjectOutputStream为节点流增加了读取对象、写入对象的功能
4.3 ObjectOutputStream
对象输出流:用来写入对象,即序列化
四、字符流
1. 简介
Reader是字符输入流的顶层父类,常用子类:
-
FileReader
-
BufferedReader
-
InputStreamReader
Writer是字符输出流的顶层父类,常用子类:
-
FileWriter
-
BufferedWriter / PrintWriter
-
OutputStreamWriter
2. 文件输入输出流
2.1 FileReader
文件字符输入流:以字符为单位,从文件中读取数据
2.2 FileWriter
文件字符输出流:以字符为单位,将数据写出到文件中
3. 缓冲输入输出流
缓冲输入输出流属于包装流,为字符流添加缓冲的功能
当读取或写出数据时,先从缓冲区读取,减少对磁盘的I/O操作,提高效率
3.1 BufferedReader
缓冲字符输入流:为字符输入流添加缓冲
3.2 BufferedWriter
缓冲字符输出流:为字符输出流添加缓冲
3.3 PrintWriter
打印流,功能更强,操作更简单
4. 转换流
用于将字节流转换为字符流,同时可以实现编码的转换
在转换时需要指定使用的字符集,如果不指定默认使用JVM的字符集
注:Java中没有提供将字符流转换为字节流的方法,不支持该操作
4.1 InputStreamReader
将字节输入流转换为字符输入流
4.2 OutputStreamWriter
将字节输出流转换为字符输出流
五、RandomAccessFile
1. 简介
随机读写流,是一个字节流,可以对文件进行随机读写
-
随机:可以定位到文件的任意位置进行读写操作,通过移动指针(Pointer)来实现
-
读写:使用该流既能读取文件也能写入文件
2. 用法
write() 写入数据
read() 读取数据
getFilePointer() 获取当前指针的位置
seek() 将指针移动到指定的位置
skipBytes() 将指针跳过指定字节

浙公网安备 33010602011771号