白话Java:IO流

一 名词解释

  • IO是洋文简写,I就是input,输入,O就是output,输出。
    IO翻译就是输入输出。就是数据传输。
    数据传输是个动态的过程,从一方出去,从一方进来。
  • 流,是数据流的意思。流是个动态概念。
    从中文字面来理解,很形象,就想象成水流。从水龙头流出,流入杯子中。
    数据流也是这个意思。用来数据传输的。
    数据流这个概念一开始是通信领域的概念,出现在1998年。
    数据传输的过程中,数据是按着规则排好队,然后一下一下地传送,一”流”一”流”地传,数据流是个含义很丰富的概念,更多了解参阅数据流的相关博文,此处不表。
  • IO流,这就是说明有两个流,输入流,输出流。输入流就是读,而且是只读不写。输出流就是写,而且是只写不读。再加上数据传输,初学者在这里很容易搞不清,什么时候是输入,什么时候是输出。这里涉及到三对概念:
    输入和输出,读和写,发送和接收,可以对照一下下面的表 :
输入接收
输出发送

二 Java当中的IO流

现在我们 知道,流是用来处理和传输数据的。
那么,很自然的,数据不一样。流就不一样。
这里就涉及到对数据进行分类的问题,角度不同,分类就不同。

第一个角度,数据的类型

流是用来传输处理数据的,那么它最小单位的传输数据应该是多大呢?
一共分为两个字节流,字符流

字节流的处理单元就是一个字节。
字符流的处理单元就是一个Unicode字符,是两个单元的。

硬盘上的文件存储的真相是这样的:
有一个文件,里边内容是字符的,
要把这个文件存到硬盘上,
那就要把文件中的字符按照一个编码规则编码成为字节,
然后再把这些字节存储到硬盘上。
真相就是硬盘上存储的都是字节。
读文件的时候就是: 字节–> 编码–>字符–>显示
写文件的时候就是 : 字符–> 编码–> 字节–>存储

根据上面的这个真相就能知道 :
字节流是能够处理任何类型的文件或者对象的。
就是有个缺陷,不能直接处理Unicode字符(两个字节)。
字符流就是专门用来处理Unicode字符(两个字节)的。处理字符和字符串。

所以,根据上面的描述可以知道什么时候用什么流。
如果你要处理音频,视频,图片,歌曲,那么请用字节流。
IO操作跟文件内容无关的时候,就用字节流。
如果你要处理文本尤其关系到中文的,请用字符流。
IO操作跟文件内容有关的时候,就用字符流。

Java当中有这么多乱七八糟的流,怎么进行区分?
Stream结尾的都是字节流。
reader和writer结尾的都是字符流

具体的两者之间的区别可以总结到下面的表格当中

处理单位处理文件类型不能处理文件类型IO应用情景
字节流一个字节视频,音频,图片等一切文件Unicode操作与文件内容无关时
字符流两个字节文本,字符串除了文本都不能操作与文件内容相关时

第二个角度,数据的来源

仔细想想,数据是可以从来源方面,做个大致的区分的。

第一种,可以简单叫做静态数据,直接读取物理介质当中的数据。比如硬盘,内存,U盘。处理和传输这种数据,就要用节点流

第二种,可以简单叫做动态数据,就是用流进行传输的时候,流中的数据。处理和传输这种数据,就要用处理流

  1. 在这里可以简单理解,节点流就是对付文件,数组等等乱七八糟的,处理流对付的就是其他的流。
  2. 所以处理流的类当中的构造方法,肯定有一个参数是一个流的对象。因为处理流就是”处理”其他流的。用构造方法初始化的时候,肯定要传入一个流对象。
  3. 把一个节点流对象传给一个处理流,封装起来了。再把这个处理流传给第二个处理流,再封装一下。可以接着进行很多次封装,这个就叫做流的链接说点专业的词汇就是:基本输入输出流,经过流的嵌套变成装饰流。

1 节点流

节点流用来对付的东西,有文件,数组,字符串,管道等。相应的,肯定有针对这些东西的输入输出流类。这样分类细致了,就可以抽出来点共同的特征,组成个父类。
节点流的父类,有四个两对: InputStream和OutputStream,Reader和Writer
具体地可以对照一下下面的表中,这都是些常用的节点流。

父类InputStreamOutputStreamReaderWriter
1.文件FileInputStreamFileOutputStreamFileReaderFileWriter
2.数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
3.字符串StringReaderStringWriter
4.管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter

2 处理流

处理流,就是用来对付流的。扩展流的一些功能的。
涉及到功能,就不像上面一样了,就不太好总结分类了。
比如加缓冲功能,流转换等,这功能是不能罗列完的。
处理流的父类跟节点流是一样一样的。
经常用的处理流可以对照下面的列表。

父类InputStreamOutputStreamReaderWriter功能
1.缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter增加缓冲功能,有flush方法
2.转换流InputStreamReaderOutputStreamWriter字节流转换成字符流
3.数据流DataInputStreamDataOutputStream把基础数据类型写入文件
4.打印流PrintStreamPrintWriter扩展输出流,方便打印各类型数据
5.对象流ObjectInputStreamObjectOutputStream读写对象
6.XML流XMLReaderXMLWriter读写xml文件

三 对流的理解

java当中如果遇到相同类型的数据要处理,就用数组集合什么的。把这些个东西叫做容器。其实,流也可以理解成一种容器。

在进行数据传输的时候用的都是字节流,在进行数据操作的时候用的都是字符流。操作不同类型的数据用的都是节点流,给流进行封装扩展功能用的都是处理流。

比方说有数据要进行传输,那就是涉及到网络编程的问题。我们就是先把数据放到流当中,然后再通过流进行传输。
流是流动的意思,流动不断,是动态的。这就可以看成是火车一样的这样运载容器。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值