在程序运行的过程中,JVM的内存中会存放很多数据,当程序结束,JVM关闭的时候,这些数据会流失,如果我们需要把这部分数据保存下来就需要把数据存入本地硬盘,但我们需要使用的时候在从硬盘将数据读入JVM中,这就涉及到JVM与外部进行数据交换。
在java中负责这部分功能API叫做 I/O(I是input缩写,代表输入,O是output缩写,代表输出),这里的输入,输出都是以JVM作为角度来考虑的,数据读入JVM叫做输入,将JVM的数据读出,我们叫做输出,IO的框架有点繁琐,我们整理一遍分类的话会比较清晰
流的分类,按照不同维度有三种,
首先按照方向有输入输出区别我们都知道。
其次按照单位有字节流,字符流区别,对于计算机内的任何资源,底层存放的都是0和1 ,这就是二进制的bit(位),8bit组成一个byte(字节),这也是计算机处理数据的最小单位,因此子接口可以传输任何资源,而当我们与文本打交道的时候有的汉字占用的空间可能不止一个字节,这样就有只保存半个汉字这种情况,为了解决这种情况提供了字符流。
最后是按照功能分有节点流和过滤流,在这个设计上,IO框架使用了“装饰模式”这个设计模式。所谓的过滤流并不能直接提供功能,而是给节点流提供额外功能。
我们总结一下IO的框架。
分类:
1.方向:
a.输入流
b.输出流
2.单位:
a.字节流: 以字节为单位,可以读取所有数据
b.字符流: 以字符为单文,可以读取文本文件
3.功能:
a.节点流: 实际数据传输
b.过滤流: 增加节点流功能(装饰模式)
下面以单位划分介绍一下字节流和字符流
字节流:
1.字节流父类:
a.OutputStream(输出)
b.InputStream(输入)
2.字节节点流
a.FileOutputStream(输出)
b.FileInputStream(输入)
3.字节过滤流
a.DataOutputStream/DataInputStream
增加,读取八种基本类型
b.BufferedOutputStream/BufferedInputStream
增加缓存区
c.ObjectOutPutStream/ObjectInputStream
可以序列化对象
字符流
1.字符流父类:
a.Writer(输出)
b.reader(输入)
2.字符节点流
a.FileWriter:
b.FileReader
3.字符过滤流
a.BufferedWriter/BufferedReader
增加缓存区,最重要的是BufferedReader 增加readLine 方法,做过封装可以直接读取一行
/**
* Reads a line of text. A line is considered to be terminated by any one
* of a line feed ('\n'), a carriage return ('\r'), or a carriage return
* followed immediately by a linefeed.
*
* @return A String containing the contents of the line, not including
* any line-termination characters, or null if the end of the
* stream has been reached
*
* @exception IOException If an I/O error occurs
*
* @see java.nio.file.Files#readAllLines
*/
public String readLine() throws IOException {
return readLine(false);
}
b.OutputStreamWriter/InputStreamReader
构造方法接收一个字节流经过它的装饰转换为字符流,并且可以设置编码格式。