java中的io流基本分类

来源:互联网 发布:鬼泣4 怪物数据 编辑:程序博客网 时间:2024/04/27 12:13
Java的IO流是实现输入/输出的基础,按照不同的分类方式,可以将流分为不同的类型:
1、按照流的流向来分,可以分为输入流输出流
输入流:只能从中读取数据,而不能向其写出数据。
输出流:只能向其写出数据,而不能从中读取数据。
Java的输入流主要由InputStream和Reader作为基类,而输出流则主要由OutputStream和Writer作为基类。
注意:这里的输入、输出都是从程序运行所在内存的角度来划分的。比如数据从内存到硬盘,我们称为输出流,数据从服务器通过网络流向客户端,Server的内存负责将数据输出到网络里,因此Server端的程序使用输出流,Client端的内存负责从网络里读取数据,因为Client端的程序使用输入流。如下图:
        

2、按操作的最小数据单元可以分为字节流字符流
字节流和字符流的区别在于字节流和字符流操作的数据单元不同:字节流操作的最小数据单元是8位的字节,而字符流操作的最小数据单元是16位的字符。字节流主要有InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类。

3、按照流的角色可以分为节点流处理流
节点流可以从/向一个特定的IO设备(如磁盘、网络)读/写数据的流,节点流常常也被称为低级流。当使用节点流进行输入/输出时,程序直接连接到实际的数据源,和实际的输入/输出节点连接。如下图:
  
处理流则用于对一个已存在的流(节点流或处理流)进行连接或封装,通过封装后的流来实现数据读/写功能。处理流也称为高级流。当使用处理流来进行输入/输出时,程序并不会直接连接到实际的数据源,没有和实际的输入/输出节点连接。如下图:
使用处理流的好处:只要使用相同的处理流,程序就可以采用完成相同的输入/输出代码来访问不同的数据源,随着处理流所包装节点流的改变,程序实际所访问的数据源也相应发生改变。

使用处理流来包装节点流是一种典型的装饰器设计模式,通过使用处理流来包装不同的节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入/输出功能。因此处理流也被称为包装流。

识别处理流和节点流的简单方法:只要流的构造器参数不是一个物理节点,而是已经存在的流,那么这种流就是一定是处理流,而所有的节点流都是直接以物理IO节点作为构造参数的。

Java的IO流的40多个类都是从4个抽象基类派生出来的:
InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。

IO流的体系图如下:


注:下表中带下划线的是抽象类,不能创建对象。粗体部分是节点流,其他就是常用的处理流。
流分类使用分类字节输入流字节输出流字符输入流字符输出流 抽象基类InputStream

OutputStream

ReaderWriter节点流访问文件FileInputStreamFileOutStreamFileReaderFileWriter访问数值ByteArrayInputStreamByteArrayOutStreamCharArrayReaderCharArrayWriter访问管道PipedInputStreamPipedOutStreamPipedReaderPipedWriter访问字符串  StringReaderStringWriter处理流缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter转换流  InputStreamReaderOutputStreamWriter对象流ObjectInputStreamObjectOutputStream  抽象基类(过滤)FilterInputStreamFilterOutputStreamFilterReaderFilterWriter打印流 PrintStream PrintWriter推回输入流PushbackInputStream PushbackReader 特殊流DataInputStreamDataOutputStream  

原创粉丝点击