Java程序中对于数据的输入和输出操作以“流”方式进行,J2SDK提供了各种各样的“流”类,用于获取不同种类的数据;程序通过标准的方法输入和输出数据。
java.io包中定义了多个流类型来实现输入、输出功能;从如下角度进行分类:
数据流的方向:输入流和输出流
处理数据单位:字节流和字符流(一个字符包含两个字节)
功能:节点流和处理流
节点流:从一个特定的“数据源(节点)”读取数据
处理流:连接在已经“存在的流”上进行数据读取。
不管有多少“流”类,最终java.io中类都继承如下四种抽象流类型:
让我们来根据功能看一下javaIO 中的流
一、节点流
节点:数据源。通俗的理解节点流:对数据的处理是从数据源点开始进行的就属于节点流。
内容类如下图:
从上表可以看出:
1、节点类型,四种:File,Memory Array,Memory String ,Pipe。
2、字符流的方法都是:Reader/Writer;字节流则为:input/output。
二、处理流
1、处理流概览
处理流:是对节点流进行“处理”的一些类,不直接跟“数据源点”交互,通过节点流来达到我们需要的输入输出数据。这就是处理流的意义所在。看如下图就是处理流的内容类。
上表特点:
1、操作对象:buffering(缓冲),filtering(过滤),Converting(转换),object(对象),Data Conversion,Printing(打印),Counting(计数),Peekingahead(预读)
2、字符流的方法都是:Reader/Writer;字节流则为:input/output。(同节点流)
二、分类
通过上表处理流的不同操作对象,接下来介绍几种主要的处理流类型类型。
1、缓冲流——buffering
套接在相应的节点流之上,对读写的数据提供了缓冲功能,可以提高读取效率,同时还可以增加一些新方法。
四个类构造如下:
2、转换流——Converting
A:上表查出转换流有两种:InputStreamReader和OutputStreamWriter两种。
B:转换流在构造时可以指定其编码集合,如:inputStream isr = new InputStreamReader(System.in,"ISO8859_1");
使用需要套接。
3、数据流——Data Conversion
可以一次性写入一个“数据”,不然,是一个字节一个字节读取,不知道写进去,或者读出来的是什么:都是以字节读,写。例如:写入:12132434,可能读出来是 1 21 3 2 4 3 4 ,这样就模糊了。
类:DataInputStream,DataOutputStream (继承自InputStream和OutputStream)
构造:DataInputStream(InputStream in)
DataOutputStream(OutputStream out)
特点:提供了可以存取与机器无关的java原始类型数据(int,double)方法。
使用需要套接
4、Print流
这个处理流是我们最常见的输出流。
类:PrintWriter(字符)、PrintStream(字节)。
构造如下:
特点如下:
都提供了重载的print方法,println方法用于多种数据类型的输出。
不会抛出异常,用户通过检测错误状态获取错误信息。
有自动的Flush功能。
使用需要套接
5、Object流——直接将object写入或者读出。
类:ObjectInputStream,ObjectOutputStream
重点如下:
Transient:修饰的成员变量在编译的时候不被考虑。输出的时候是看不到的值(会显示0)
Serializable:Serializable是标记性接口。接口内没有方法。
Externalizable:外部化接口,继承来自serializable接口,自己控制自己的序列化过程。一般不使用。如果不使用这个接口,那么直接实现serializable接口,由JDK 控制。
使用需要套接
三、共同点——套接
观察以上所有处理流的类构造方法中都需要参数,这个参数是做什么用的呢?——套接。通过传递的参数和要作用的对象产生关联。
处理流的使用都需要套接。套接谁?为什么要套接?
这个不难理解,因为处理流的特性就是要对字节流进行处理加工,所以处理流声明过程中,肯定要指定它要“服务”的对象。所以套接的就是字节流,具体是如下四种抽象类型:
最终还是回归到了原点,不论怎么处理,最终我们都还是对这基本四种的“流”进行变形,达到我们期望的输入输出。