分类
按数据流向的不同
输入流input
读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
输出流output
将程序(内存)数据输出到磁盘、光盘等存储设备中
按操作数据的单位不同
字节流
通常用来处理非文本文件,如果涉及到文本文件的复制也可以使用
能处理文本文件,也能处理非文本文件
字符流
只能处理文本文件,不能处理非文本文件
根据IO流角色的不同
节点流
直接从数据源或目的地读写数据
处理流
不直接连接到数据源或目的地,而是连接已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能
java的IO流的4个抽象基类
字节流
InputStream
// 每次读一个字节,如果返回-1表示文件已经读到末尾
int read()
// 每次读指定数量的字节,如果返回-1表示文件已经读到末尾;返回值是读取到的字节的个数,读到的数据在cbuf的数组中;多次获取数据时会覆盖cbuf数组中的元素,如果最后一次获取的字节数小于定义的cbuf数组长度,尾部的元素是上一次读取的字节
int read(buffer[] cbuf)
// 关闭流
close()
OutputStream
// 写入
void write(buffer[] data)
// 将数组中从指定索引开始,指定长度的字节写入到文件
void write(buffer[] data, int fromIndex, int len)
// 关闭流
close()
// 将内存中的文件写入到磁盘文件
flush()
字符流
Reader
// 每次读一个字符,如果返回-1表示文件已经读到末尾;返回值是从(0-65535),返回值需要转换为char类型,得到一个真是的字符
int read()
// 每次读指定数量的字符,如果返回-1表示文件已经读到末尾;返回值是读取到的字符的个数,读到的数据在cbuf的数组中;多次获取数据时会覆盖cbuf数组中的元素,如果最后一次获取的字符数小于定义的cbuf数组长度,尾部的元素是上一次读取的字符
int read(char[] cbuf)
// 关闭流
close()
Writer
// 写入指定的字符串
void write(String str)
// 写入
void write(char[] data)
// 将数组中从指定索引开始,指定长度的字符写入到文件
void write(char[] data, int fromIndex, int len)
// 关闭流
close()
// 将内存中的文件写入到磁盘文件
flush()
常用的节点流
文件流
FileInputStream
// 创建一个读文件的流,需要处理IOException,文件不存在时会抛异常
new FileInputStream(File file)
FileOutputStream
// 创建一个写文件的流,需要处理IOException,文件不存在时会创建一个文件,文件存在时会覆盖文件
new FileOutputStream(File file)
// 创建一个写文件的流,append为true,写入文件时会在现有的文件基础上,追加内容,为false与上一个构造器相同
new FileOutputStream(File file, boolean append)
FileReader
// 创建一个读文件的流,需要处理IOException,文件不存在时会抛异常
new FileReader(File file)
FileWriter
// 创建一个写文件的流,需要处理IOException,文件不存在时会创建一个文件,文件存在时会覆盖文件
new FileWriter(File file)
// 创建一个写文件的流,append为true,写入文件时会在现有的文件基础上,追加内容,为false与上一个构造器相同
new FileWriter(File file, boolean append)
缓冲流
在内存中提供一个缓存区,将内容先放在缓冲区,当缓冲区满时与磁盘进行交互,加快大文件的读写效率
BufferedInputStream
// 创建一个读文件的缓冲流,需要处理IOException,文件不存在时会抛异常
new BufferedInputStream(FileInputStream fileInputStream)
// 关闭流的同时会关闭构造器中传递的流
close()
BufferedOutputStream
// 创建一个写文件的缓冲流,需要处理IOException
new BufferedOutputStream(FileOutputStream fileOutputStream)
// 关闭流的同时会关闭构造器中传递的流
close()
// 将内存中的文件写入到磁盘文件
flush()
BufferedReader
// 创建一个读文件的缓冲流,需要处理IOException,文件不存在时会抛异常
new BufferedReader(FileReader fileReader)
// 读取一行,读取到换行符时表示一行,返回null表示已经读到末尾;读取到字符串不包含换行符
String readLine()
// 关闭流的同时会关闭构造器中传递的流
close()
BufferedWriter
// 创建一个写文件的缓冲流,需要处理IOException
new BufferedWriter(FileWriter fileWriter)
// 关闭流的同时会关闭构造器中传递的流
close()
// 将内存中的文件写入到磁盘文件
flush()
转换流
字符流与字节流之间的转换
解码时使用的字符集必须与当初编码时使用的字符集兼容
InputStreamReader
将一个输入型的字节流转换为输入型的字符流
// 创建一个读文件的转换流,需要处理IOException,文件不存在时会抛异常
new InputStreamReader(InputStream inputStream)
// 创建一个使用指定字符集的读文件的转换流,需要处理IOException,文件不存在时会抛异常
new InputStreamReader(InputStream inputStream, String charsetName)
OutputStreamWriter
将一个输出型的字符流转换为输出型的字节流
// 创建一个写文件的转换流,需要处理IOException,文件不存在时会抛异常
new OutputStreamWriter(OutputStream outputStream)
// 创建一个使用指定字符集的写文件的转换流,需要处理IOException,文件不存在时会抛异常
new OutputStreamWriter(OutputStream outputStream, String charsetName)
数据流
只能读写基本数据类型和String
DataInputStream
DataOutputStream
对象流
基本数据类型和对象读写
序列化
允许把内存的对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存到磁盘中或通过网络将这种二进制流传输到另一个网络节点。其他程序获取了这种二进制流,就可以恢复成原来的java对象
自定义类序列化的要求
需要实现Serialzable serialVersionUID的目的是为了对比序列化前与反序列化后的对象是同一个对象;不声明serialVersionUID时,系统会自动声明生成一个针对于当前类的serialVersionUID,但是修改类后serialVersionUID会随之变化;Serialzable属于一个标识接口;
声明全局常量serialVersionUID
当前类的各个属性也必须是可序列化的,基本数据类型默认是可以序列化的
注意
如果类的所有属性必须时可序列化的,如果有一个属性不需要序列化,则该属性必须注明是瞬态的,使用transient关键字修饰
静态变量的值不会序列化,因为静态变量的值不属于某个对象
ObjectInputStream
将对象反序列化:将二进制流还原为原来的对象
// 创建一个读对象的对象流,需要处理IOException
new ObjectInputStream(FileInputStream fileInputStream)
// 读取指定类型对象
readXxx()
ObjectOutputStream
将对象序列化:将对象转换为二进制流
// 创建一个写对象的对象流,需要处理IOException
new ObjectOutputStream(FileOutputStream fileOutputStream)
// 写入指定类型对象
writeXxx(xxx)
其他流
标准输入流in
底层是一个final的常量
System.in 默认从键盘输入
// 修改输入流的位置,是调用底层c++的代码进行修改
setIn(InputStream inputStream)
// 自定义一个读键盘输入的流
new BufferedInputStream(new InputStreamReader(System.in))
标准输出流out
底层是一个final的常量
System.out 默认从显示器输出
// 修改输出流的位置,是调用底层c++的代码进行修改
setOut(OutputStream outputStream)
打印流
PrintStream、PrintWriter
提供了一系列print、println方法
apache-common包
IO技术的工具类commonsIO,简化了IO开发