前言:在当今海量数据的时代,数据在网络中随处流动,,在这个流动的过程中都涉及I/O问题,可以说大部分WEB应用系统的瓶颈都是I/O瓶颈。I/O问题是任何语言都无法回避的问题,可以说I/O问题是整个人机交互的核心问题,因为I/O是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O问题尤为突出。
正文:
Java的I/O操作类在包java.io下,大概有将近80个类,这些类大致可分为如下四组:
- 基于字节操作的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只是人与机器或者机器与机器完成交互的手段,我们关注的是如何提升它的运行效率。而数据格式和传输方式是影响传输效率最关键的因素。
一、基于字节的I/O操作接口
输入:InputStream(是字节输入流的顶级父类)
输出:OutputStream(是字节输出流的顶级父类)
1.操作数据的方式是可以组合使用的:
eg:OutputSteam out = new BufferedOutputStream(new objectOutputStream(new FileOutputStream("fileName")));
2.指定流最终写到什么地方去。(要么是磁盘,要么是网络中),写入网络实际上也是写文件,只不过写网络还有一些需要处理。就是让底层操作系统再将数据传送到其他地方,而不是本地磁盘。
二、基于字符的I/O操作接口
I/O操作都是以字节为单位进行的,之所以产生字符I/O是程序在平常操作数据的过程中都是以字节为基本单位。为了操作方便从而衍生出来。(字节与字符之间的转化需要编码操作)
写出:Writer
读入:Reader
三、字节与字符之间的转化
InputStream与OutputStream完成数据的读取
StreamDecoder与StreamEncoder完成解码过程
最终由InputStreamReader与OutputStreamWriter完成最后的转换工作