9、IO

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() 将指针跳过指定字节

 

 

 

 

 

posted @ 2023-03-17 16:50  大冶  阅读(79)  评论(0)    收藏  举报