一、什么是IO
- I : Input
- O : Output
- 通过IO可以完成硬盘文件的读和写
二、IO流的分类
- 一种方式是按照流的方向进行分类:
以内存作为参照物
往内存中去,叫做输入(Input),或者叫做读(Read),是输入流(InputStream)
从内存中出来,叫做输出(Output),或者叫做写(Write),是输出流(OutputStream) - 一种方式是按照读取数据方式不同进行分类
有的流是按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位,这种流是万能的,什么类型的文件都可以读取,包括:文本文件,图片,声音文件,视频文件等…
有的流是按照字符的方式读取数据的,一次读取一个字符,这种流是为了方便读取,以普通文本文件而存在的,这种流不能读取:图片、声音、视频等文件,只能读取纯文本文件,连word文件都无法读取
- 字节流与字符流
字节流:一切文件数据(文本文件,图片,声音文件,视频文件等)在存储时,都是以二进制数字的形式保存,即一个一个的字节,传输时一样如此,所以,字节流可以传输任意文件数据,在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据
字符流:当使用字节流读取文本文件时,可能会有一个小问题,就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储,所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件 - 综上所述,流的分类:
输入流、输出流
字节流、字符流 - Java中所有的流都是在:java.io.*;下
三、Java四大 IO流
- java.io.InputStream(字节输入流)
- java.io.OutputStream(字节输出流)
- java.io.Reader(字符输入流)
- java.io.Writer(字符输出流)
- 以上都是抽象类
- 所有的流都实现了:java.io.Closeable接口,都是可关闭的,都有close()方法
流是一个管道,即内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源 - 所有的输出流都实现了:java.io.Flushable接口,都是可刷新的,都有flush()方法
输出流在最终输出之后,一定要flush()刷新一下,表示将通道/管道当中剩余未输出的数据强行输出完(即清空管道),刷新的作用就是清空管道
注意:如果没有flush()可能会导致丢失数据 - 注意:在Java中只要“类名”以Stream结尾的都是字节流;以“Reader/Writer”结尾的都是字符流
- InputStream与OutputStream 继承结构图
引用图片:
- Reader与Writer 继承结构图
引用图片:
四、java.io包下16个掌握的流
- 文件专属:
java.io.FileInputStream(掌握)
java.io.FileOutputStream(掌握)
java.io.FileReader
java.io.FileWriter - 转换流:(将字节流转换成字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter - 缓冲流:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream - 数据流:
java.io.DataInputStream
java.io.DataOutputStream - 标准输出流:
java.io.PrintWriter
java.io.PrintStream(掌握) - 对象专属流:
java.io.ObjectInputStream(掌握)
java.io.ObjectOutputStream(掌握)
五、节点流与处理流
1. 节点流
- 未经封装,low level stream
- 节点流直接与数据源相连,用于输入或者输出
- 节点流是可以从或向一个特定的地方(节点)读写数据,也叫低级流,如FileReader
1.1 常用节点流
- 父类
InputStream
OutputStream
Reader
Writer - 文件(对文件进行处理的节点流)
FileInputStream
FileOutputStream
FileReader
FileWriter - 数组(对数组进行处理的节点流)
ByteArrayInputStream
ByteArrayOutputStream
CharArrayReader
CharArrayWriter - 字符串(对字符串进行处理的节点流)
StringReader
StringWriter - 管道(对管道进行处理的节点流)
PipedInputStream
PipedOutputStream
PipedReader
PipedWriter
2. 处理流
- 封装过, high level stream
- 外部负责包装的这个流,叫做:包装流/处理流,是在节点流的基础上对之进行加工,通过封装后来实现数据的读写功能,处理流的构造方法必须要传入节点流的子类,对于处理流来说,只需要关闭最外层流就行,里面的节点流会自动关闭( in.close() )
- 节点流与包装流是相对而言的
2.1 常用处理流
- 父类
InputStream
OutputStream
Reader
Writer - 缓冲流(需要父类作为参数构造,增加缓冲功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,所以写数据的时候需要使用flush方法)
BufferedImputStream
BufferedOutputStream
BufferedReader
BufferedWriter - 转换流
InputStreamReader
OutputStreamWriter