学习Java中的IO,首先要理解Java中IO的流模型。

 

所谓流,可以假想成河流,流的数据源,就是河流的发源地;流的单向性,就像河流的水流是单向的一样。

 

Java中的IO流,从两方面去分类。

  • 输入流和输出流
  • 节点流和处理流

输入流和输出流,就是程序和外部的数据源进行IO操作。这些数据源可以是可以是内存,文件,还可以是网络上的一个URL。

 

输入流和输出流的定义都是相对程序来说的,也就是输入流是从外部读取数据进入程序,然后由程序处理。输出流是从程序中输出的数据。

 

节点流和处理流。节点流是直接跟数据源连接的流,而处理流是用来装饰节点流的,是为使节点流有更多的功能。

 

Java中的IO流都源自下面的四个抽象类:

 

IO流

输入流

输出流

字节流

InputStream

OutputStream

字符流

Reader

Writer

 

这就是Java中IO的基本概念。

 

对于上面的字节流和字符流,他们的区别就在于字节流会以字节的形式来处理数据,而字符流会以字符的形式来处理数据。

 

JVM中统一使用Unicode来编码字符。

 

这样,我们就可以开始更进一步的学习Java IO流了。

 

可以这样子思考:

先学习字节流的输入流,这样相应的输出流就相应的学习了;

后学习字符流的输入流,这样相应的输出流就也就相应的学习了;

再学习一些另外的流。

 

 

对于字节流的输入流,就是 InputStream的抽象类向下延伸。

 

因为数据源可以在在文件中,在内存中。

所以,一般的字节输入流有 FileInputStream、ByteArrayInputStream 等方法。操作的也是相应的数据源。

至于相应的主要函数,可以从JDK中了解。

 

因此,对应的,就有字节输出流的 FileOutputStream、ByteArrayOutputStream。

 

 

而对于字符流的输入流,就是 Reader的抽象类的向下延伸。

 

同样的,数据源可以在文件中,在内存中。

因此,一般的字符输入流有 FileReader、CharArrayReader等方法。

输出流也相对应。

 

总的来看,字节流和字符流也是对应的。

 

但是这里要提出,字符流中还有一个节点流,那就是 StringReader ,因为String就是字符窜。

 

现在是了解了节点流。下面是处理流。

 

所谓处理流,就是不直接连接到数据源,而是对连接数据流的节点流进行装饰,使得流能提供更多更好的功能。

 

常见的处理流有(以下的类如果没有写,就代表无此类,或者已不适用):

  • 缓冲流。BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream。
    这种流是就是为增加了缓冲功能,提高的IO效率。
  • 字节流转为字符流。 InputStreamReader,InputStreamWriter,当然,可以在创建此类的时候设置字符编码。
  • 对象序列化流。ObjectInputStream、ObjectOutputStream。
  • 各种类型数据的输入输出。DataInputStream、DataOutputStream。
  • 行流。LineNumberReader;LineNumberInputStream
  • 打印流。PrintWriter;PrintOutputStream。