I/O 流
流的基本概念
输入输出是任何语言都会涉及的内容,内存中的数据,当程序运行完毕或中断退出,当前操作的数据就会消失。
如果要将系统的数据保存起来,就需要流的操作,文件的操作。
流:当需要读取数据的时候,就需要开启一个通向数据源的设备流。这个数据源可以是文件、内存、网络资源等。
当程序需要写入数据的时候,就需要开启一个通向目的地的设备流,这个时候我们可以将数据理解为流,在管道里进行传输或流动。
特征:
1、含有流质
2、具有方向
符合计算机中系统中数据传输的特征,流来抽象数据传递。
方向: 硬盘文件==》程序(输入流)
程序===》硬盘文件(输出流)
程序中流的分类
java.io
包中提供了我们操作数据使用的各种流。
按照分向分:
1、输入流 (InputStream
类, Reader
类)对象代表输入流
2、输出流(OutputStream
类,Writer
类)
按照类型分:
1、字节流:以byte
为最小单位进行传递。字节流经常用于操作二进制的文件(图片、音频、视频)
2、字符流:以char
为最小单位进行传递。(针对于文本内容)
按照功能分:
1、节点流:节点流表示从一个特定的数据源进行读取数据,节点流一般直接操作文件、或者网络等提供的流。它们直接从文件读取数据或直接将数据写入到文件中,也称为低级流。
2、处理流:处理流不是直接连接到设备上,而是建立在其他流之上,也通过对数据处理提供更强大的功能,也称为高级流。(程序中大多使用处理流)
class类:InputStream
、OutputStream
、Reader
、Writer
都是抽象类。
操作流的步骤:
1、建立流、根据不同类型的数据选择不同的流进行操作。
2、操作流,将数据数据读取到内存或者将内存数据写入到数据源
3、关闭流,释放所有的资源。
file文件类的操作
java.io
包提供的一个类,用于管理磁盘里的所有文件或者文件的目录。比如:文件的大小、名字、类型都可以操作,唯一不能操作文件的内容。
File
类描述的是一个文件或者一个文件夹,该类是为了封装File
对象提供各种文件操作方法,供我们开发过程中直接调用接口就可以完成某些的特定功能。
具体流的操作
深色为节点流、浅色为处理流。
InputStream
:
FileInputStream
:对二进制的文件进行操作,数据源一般为磁盘
PipedInputStream
: 主要针对线程管道
FilterIutputStream
: 过滤流、提供的子类非常重要,缓冲流、数据流
BufferedInputStream
缓冲流:
作用:
1、减少了磁盘的IO操作
2、 提高了数据读写的效率。
DataInputStream
:数据操作流
1、读取的数据转为byte
,boolean
、long
、float
等。也可以输出byte
、long
等数据类型。
LineNumberInputStream
: 表示程序读取到哪一行,计数器。
ByteArrayInPutStream
:对内存缓冲区的数据进行读写操作、数据源是内存的字节数组。
SequenceInputStream
:实现两个文件的合并。
StringBufferInputStream
:用于操作字符串的流.
ObjectInputStream
:对象流,用于操作内存中对象.
字符流
以字符为单位来进行传输,char采用16位Unicode编码表示字符和字符串。
分为两类:
字符输入流:Reader
类
字符输出流:Writer
类
字符集:就是规定了摸个文字对应的二进制的存放方式(编码)和某个二进制代表了那个文字(解码)的转换关系
字符编码:计算机只能存放0或1二进制数据,我们要对各种字符指定一个数字编码,这种编码就是编码集。
字符编码:“UTF-8”;“gb2312”,“gbk”,“unicode” 编码。
计算机中只保存字符对应的编码,计算机只需维持字符集清单,当读到这种编码的时候就拿去和清单进行对比找出当前字符,在显示成我们可以识别的字符样式。
Reader 和Writer
针对文件传输,一般选择用字节流。
文件操作步骤
1、创建文件对象
2、创建流对象
3、读取信息、写入信息
4、关闭流,先开的先关,如果有处理流,优先关处理流,一般有处理流就可以不关节点流。
对象流的操作
对象的序列化:将所有的object
对象转化为byte
为单位内容传输到目的地(磁盘、网络空间)
反序列化:将磁盘的数据已byte
为单位读取,转化为object
对象存放到内存。
创建对象方式:1、new 2、克隆 3、 反序列化
序列化规范:
1、你要序列化对象必须要实现Serializable
接口,如果对象没有实现接口,序列化的时候会抛出没有实现接口的异常。
2、静态变量和成员方法不可序列化。
3、一个类要被序列化,该类引用的对象也是可以被序列化的,否则整个序列化过程将失败。
4、声明transient 关键字,可以控制当前属性可以不被序列化。
序列化的类:
ObjectInputStream
序列化对象
ObjectOutputStream
反序列对象
注:写入文件时,默认会将数据给覆盖,后面传输的内容会覆盖前面的内容,以前的数据丢失。如要追加在构造方法后面添加一个true的参数。序列化对象时每次在创建对象会追加一个4个字节头信息,输出的时候需减去。