学习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。