Java IO里流的概念和转换流

来源:互联网 发布:动态数组clear函数 编辑:程序博客网 时间:2024/05/18 02:51

  很多编程语言里关于io这块的时候,会使用流这个抽象概念,而不是用输入设备和接收设备这些名词,那么流代表什么呢?《Thinking in Java》里解释地非常好:所谓流,代表任何有能力产出数据的数据源对象(对应输入流)或者是有能力接收数据的接收端对象(输出流)。我们可以按照下图理解流,把程序抽象成一块内存,输入设备和接收设备分别是输入流和输出流,输入和输出、读入和写出都是相对于程序内存而言的。输入流有InputStream和Reader,输出流有OutputStream和Writer。


这里写图片描述
图1. 流的概念


  众所周知,Java里有两个常用的转换流:InputStreamReader和OutputStreamWriter,这两个类属于适配器类。有一个很容易让人疑惑的地方是OutputStreamWriter的构造器明明传入的是一个OutputStream对象,生成的是一个Writer对象,但是我们却说这个转换流是将字符流转换成字节流的桥梁;而理解InputStreamReader是字节流到字符流的桥梁却没有什么问题。
  关于OutputStreamWriter是字符流转换成字节流的桥梁这一说法并没有错,我们只需要搞清楚数据在图1中经过流的顺序就容易理解了。关于OutputStreamWriter的用法如下:

OutputStream out = System.out;OutputStreamWriter osw = new OutputStreamWriter(out);BufferedWriter bufw = new BufferedWriter(osw);
  • 数据从内存输出到接收设备的顺序为:缓冲流->转换流->字节输出流,上面代码段里bufw是字符流,经过转换流变成字节流out后,由out输出到接收设备。
  • 数据从发送设备输入到内存的顺序为:字节输入流->转换流->字符流。
      这样的话,是不是理解了其中的区别了呢?因此,OutputStreamWriter是字符流转换成字节流的桥梁这一说法并没有错。