IO流
1 流的概念
在计算机中,流是个抽象的概念,是对输入输出设备的抽象。在Java程序中,对于数据的输入/输出操作,都是以"流"的方式进行
数据以二进制的形式在程序与设备之间流动传输,就像水在管道里流动一样,所以就把这种数据传输的方式称之为输入流、输出流。这里描述的设备,可以是文件、网络、内存等。
流具有方向性,可以分为输入和输出。以Java程序本身作为参照点,如果数据是从程序“流向”文件,那么就是输出流,如果数据是从文件“流向”程序,那么这就是输入流。如下图:
注意,此处以文件进行举例,Java程序中还可以把数据写入到网络中、内存中等。
2 流的分类
Java中的IO流可以根据很多不同的角度进行划分,最常见的是以数据的流向和数据的类型来划分
按数据的流向分为:
-
输入流 :把数据从其他设备上读取到程序中的流
-
输出流 :把数据从程序中写出到其他设备上的流
按数据的类型分为:
- 字节流 :以字节为单位(byte),读写数据的流
- 字符流 :以字符为单位(char),读写数据的流
输入流 | 输出流 | |
---|---|---|
字节流 | 字节输入流 | 字节输出流 |
字符流 | 字符输入流 | 字符输出流 |
最终分类:
-
字节输入流,在程序中,以字节的方式,将设备(文件、内存、网络等)中的数据读进来
-
字节输出流,以字节的方式,将数据写入到设备中
-
字符输入流,以字符的方式,将设备中的数据读进来
-
字符输出流,以字符的方式,将数据写入到设备中
3 流的结构
在Java中,和IO流相关的类,主要是在
java.io
包下的定义的
几乎所有的流,都是派生自下面4个抽象父类:
InputStream
,代表字节输入流类型OutputStream
,代表字节输出流类型Reader
,代表字符输入流类型Writer
,代表字符输出流类型
Java中常用流及其继承结构:
注意:一般情况下,一个流会具备最起码的三个特点:
- 输入还是输出
- 字节还是字符
- 流的目的地
流的目的地:如果是输入流,表示这个流从什么地方读数据;如果是输出流,表示这个流把数据写到什么地方!根据这个规律,再来查看上面的流的关系结构图,就会更加清楚了。