一、简介
说到 I/O,想必大家都不会陌生,I/O 英语全称:Input/Output,即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出 。比如我们常用的 SD 卡、U 盘、移动硬盘等等存储文件的硬件设备,当我们将其插入电脑的 usb 硬件接口时,我们就可以从电脑中读取设备中的信息或者写入信息,这个过程就涉及到 I/O 的操作 。
文章插图
当然,涉及%20I/O%20的操作,不仅仅局限于硬件设备的读写,还要网络数据的传输,比如,我们在电脑上用浏览器搜索互联网上的信息,这个过程也涉及到%20I/O%20的操作 。
文章插图
无论是从磁盘中读写文件,还是在网络中传输数据,可以说 I/O 主要为处理人机交互、机与机交互中获取和交换信息提供的一套解决方案 。
在 JAVA 的 IO 体系中,类将近有 80 个,位于java.io包下,感觉很复杂,但是这些类大致可以分成四组:
- 基于字节操作的 I/O 接口:InputStream 和 OutputStream
- 基于字符操作的 I/O 接口:Writer 和 Reader
- 基于磁盘操作的 I/O 接口:File
- 基于网络操作的 I/O 接口:Socket
虽然 Socket 类并不在java.io包下,但是我们仍然把它们划分在一起,因为 I/O 的核心问题,要么是数据格式影响 I/O 操作,要么是传输方式影响 I/O 操作,也就是将什么样的数据写到什么地方的问题,I/O 只是人与机器或者机器与机器交互的手段,除了在它们能够完成这个交互功能外,我们关注的就是如何提高它的运行效率了,而数据格式和传输方式是影响效率最关键的因素 。
本文后面,也是基于这两个点进行深入展开分析 。
二、基于字节操作的接口基于字节的输入和输出操作接口分别是:InputStream 和 OutputStream。
2.1、字节输入流InputStream 输入流的类继承层次如下图所示:
文章插图
输入流根据数据节点类型和处理方式,分别可以划分出了若干个子类,如下图:
文章插图
OutputStream 输出流的类层次结构也是类似 。
2.2、字节输出流OutputStream 输出流的类继承层次如下图所示:
文章插图
输出流根据数据节点类型和处理方式,也分别可以划分出了若干个子类,如下图:
文章插图
在这里就不详细的介绍各个子类的使用方法,有兴趣的朋友可以查看 JDK 的 API 说明文档,笔者也会在后期的文章会进行详细的介绍,这里只是重点想说一下,无论是输入还是输出,操作数据的方式可以组合使用,各个处理流的类并不是只操作固定的节点流,比如如下输出方式:
//将文件输出流包装到序列化输出流中,再将序列化输出流包装到缓冲中OutputStream out = new BufferedOutputStream(new ObjectOutputStream(new FileOutputStream(new File("fileName")));
另外,输出流最终写到什么地方必须要指定,要么是写到硬盘中,要么是写到网络中,从图中可以发现,写网络实际上也是写文件,只不过写到网络中,需要经过底层操作系统将数据发送到其他的计算机中,而不是写入到本地硬盘中 。三、基于字符操作的接口不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符,所以 I/O 操作的都是字节而不是字符,但是为什么要有操作字符的 I/O 接口呢?
这是因为我们的程序中通常操作的数据都是以字符形式,为了程序操作更方便而提供一个直接写字符的 I/O 接口,仅此而已 。
基于字符的输入和输出操作接口分别是:Reader 和 Writer,下图是字符的 I/O 操作接口涉及到的类结构图 。
3.1、字符输入流Reader 输入流的类继承层次如下图所示:
文章插图
同样的,输入流根据数据节点类型和处理方式,分别可以划分出了若干个子类,如下图:
推荐阅读
- 马航MH370事件再现谜团 马航mh370失踪之谜:失联真相终于浮出水面
- 裁员|12家互联网大厂被约谈没多久,腾讯再度裁员,职场你还受得住么?
- 世界上真的有人会通灵吗 为什么真的有通灵人
- 特异功能是真的吗 有人有特异功能吗
- 别再被4s店修理厂忽悠了!这3个常见发动机保养,并不用经常做
- 专家提醒,现炒茶至少需存放十天再喝
- 汽车副厂件和原厂件有何区别别再傻傻分不清
- 女人到了中年别再装嫩,学学她们的“大气穿搭”,优雅大方显气质
- 梦见有人想非礼我但没成功但是,有男人救了我 梦见有人想非礼我但没成功但我裸体跑了
- 孕妇梦见自己在空中飞来飞去 梦见自己在空中飞来飞去的有人在追