------- android培训、java培训、期待与您交流! ----------
之所以把IO和Java网络编程放在一起是因为学习Java网络编程时,看完Java网络编程的API后感觉就没有网络什么事了,具体还是在使用Java的IO在进行数据传输,所以主要还是说说Java的IO,至于网络把计算机网络通信理解了也就差不多了,毕竟Java已经封装好了这些协议在理解了网络通信的基础上会用就行。不过对于Java网络编程有一个东西最为核心——套接字(Socket),也就是主机+端口,主机就是一个计算机网卡的MAC地址以及它所在网络的IP地址,通过这两个地址一台计算机知道另一台计算机的存在,端口是操作系统分配给应用程序的逻辑地址,通过它一个程序可以找到另一个它希望与之通信的程序。这样通过套接字就可以进行网络编程了。理解了套接字,Java的IO也搞清楚了,那么Java网络编程也就没什么问题了。关于计算机网络通信部分,大学里的基本功,这里就不再赘述了。
IO里面东西很多,而且各有特色。如果没有理清思路一味只顾看看Java的API可能会如坠云雾,时间一长由于没有搞清楚其中的关系,那就会学多少忘多少,浪费时间和精力。其实呢IO是很好学的,记住以下几点甚至不用花时间看API也能会。这几点可以归为几组词:输入流和输出流、字节流和字符流、装饰设计模式。Java的IO用于处理数据的传输,Java数据操作都是通过流的方式,数据的类型可分为字节流和字符流,数据按传输的方向分为输入流和输出流。Java的IO操作基于几个基类:字节流基类InputStream和OutputStream,字符流基类Reader和Writer。由这几个基类根据需要按照装饰者设计模式衍生许多的功能子类,所以IO中类和类间的关系很重要。顺着这条主线Java的IO部分会比较清晰,学起来目的性更强。本文主要就是讲解IO类与类之间的关系,对IO部分不对某个类作详细阐述了,也就是不会对一个具体类给出Java代码示例了,不过在每个类关系图下会有对每个的简介,如果需要使用IO的话根据下面一系列的关系图自己到IO包里面找具体的类。
1. 以字节为单位的输入流的框架图
从中,我们可以看出。
(01) InputStream 是以字节为单位的输入流的超类。InputStream提供了read()接口从输入流中读取字节数据。
(02) ByteArrayInputStream 是字节数组输入流。它包含一个内部缓冲区,该缓冲区包含从流中读取的字节;通俗点说,它的内部缓冲区就是一个字节数组,而ByteArrayInput Stream本质就是通过字节数组来实现的。
(03) PipedInputStream 是管道输入流,它和PipedOutputStream一起使用,能实现多线程间的管道通信。
(04) FilterInputStream 是过滤输入流。它是DataInputStream和BufferedInputStream的超类。
05) DataInputStream 是数据输入流。它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。
(06) BufferedInputStream 是缓冲输入流。它的作用是为另一个输入流添加缓冲功能。
(07) File 是“文件”和“目录路径名”的抽象表示形式。关于File,注意两点:
a), File不仅仅只是表示文件,它也可以表示目录!
b), File虽然在IO包定义,但是它的超类是Object,而不是InputStream。
(08) FileDescriptor 是“文件描述符”。它可以被用来表示开放文件、开放套接字等。
(09) FileInputStream 是文件输入流。它通常用于对文件进行读取操作。
(10) ObjectInputStream 是对象输入流。它和ObjectOutputStream一起,用来提供对“基本数据或对象”的持久存储。
2. 以字节为单位的输出流的框架图
从中,我们可以看出。以字节为单位的输出流的公共父类是OutputStream。
(01) OutputStream 是以字节为单位的输出流的超类。OutputStream提供了write()接口从输出流中读取字节数据。
(02) ByteArrayOutputStream 是字节数组输出流。写入ByteArrayOutputStream的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray () 和 toString() 获取数据。
(03) PipedOutputStream 是管道输出流,它和PipedInputStream一起使用,能实现多线程间的管道通信。
(04) FilterOutputStream 是过滤输出流。它是DataOutputStream,BufferedOutputStream和PrintStream的超类。
(05) DataOutputStream 是数据输出流。它是用来装饰其它输出流,它“允许应用程序以与机器无关方式向底层写入基本 Java 数据类型”。
(06) BufferedOutputStream 是缓冲输出流。它的作用是为另一个输出流添加缓冲功能。
(07) PrintStream 是打印输出流。它是用来装饰其它输出流,能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
(08) FileOutputStream 是文件输出流。它通常用于向文件进行写入操作。
(09) ObjectOutputStream 是对象输出流。它和ObjectInputStream一起,用来提供对“基本数据或对象”的持久存储。
3. 以字节为单位的输入流和输出流关联的框架图
4. 以字符为单位的输入流的框架图
从中,我们可以看出。以字符为单位的输入流的公共父类是Reader。
(01) Reader 是以字符为单位的输入流的超类。它提供了read()接口来取字符数据。
(02) CharArrayReader 是字符数组输入流。它用于读取字符数组,它继承于Reader。操作的数据是以字符为单位!
(03) PipedReader 是字符类型的管道输入流。它和PipedWriter一起是可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedWriter和PipedReader配套使用。
(04) FilterReader 是字符类型的过滤输入流。
(05) BufferedReader 是字符缓冲输入流。它的作用是为另一个输入流添加缓冲功能。
(06) InputStreamReader 是字节转字符的输入流。它是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
(07) FileReader 是字符类型的文件输入流。它通常用于对文件进行读取操作。
5. 以字符为单位的输出流的框架图
(01) Writer 是以字符为单位的输出流的超类。它提供了write()接口往其中写入数据。
(02) CharArrayWriter 是字符数组输出流。它用于读取字符数组,它继承于Writer。操作的数据是以字符为单位!
(03) PipedWriter 是字符类型的管道输出流。它和PipedReader一起是可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedWriter和PipedWriter配套使用。
(04) FilterWriter 是字符类型的过滤输出流。
(05) BufferedWriter 是字符缓冲输出流。它的作用是为另一个输出流添加缓冲功能。
(06) OutputStreamWriter 是字节转字符的输出流。它是字节流通向字符流的桥梁:它使用指定的 charset 将字节转换为字符并写入。
(07) FileWriter 是字符类型的文件输出流。它通常用于对文件进行读取操作。
(08) PrintWriter 是字符类型的打印输出流。它是用来装饰其它输出流,能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
6. 以字符为单位的输入流和输出流关联的框架图
7. 字节转换为字符流的框架图
从中,我们可以看出。
(01) FileReader继承于InputStreamReader,而InputStreamReader依赖于InputStream。具体表现在InputStreamReader的构造函数是以InputStream为参数。我们传入InputStr eam,在InputStreamReader内部通过转码,将字节转换成字符。
(02) FileWriter继承于OutputStreamWriter,而OutputStreamWriter依赖于OutputStream。具体表现在OutputStreamWriter的构造函数是以OutputStream为参数。我们传入Ou tputStream,在OutputStreamWriter内部通过转码,将字节转换成字符。
8. 字节和字符的输入流对应关系
9. 字节和字符的输出流对应关系
这就是对IO的总结了,搞清楚这些图,以后有什么需要就查那个类的API。