深入分析Java I/O的工作机制 (一)
此篇博客看至许令波的深入分析javaWeb内幕书籍, 此篇博客写的是自己看完之后理解的重点内容,加一些理解,希望对你有帮助。
1.Java的I/O类库的基本架构
先说一下什么是类库:可以说是类的集合,类库包括接口、抽象类、具体类等。
I/O是机器获取和交互信息的主要渠道。 java在I/O上也一直在做持续的优化,在1.4版开始引入了NIO,提升了I/O的性能。
java的I/O操作类在包java.io下,大概有80个类左右,这些类大概可以分为如下4组:
基于字节操作的I/O接口:InputStream和OutputStream (字节是电脑存储信息的最小单位,字符比字节大,一般我们操作的数据都是字符形式的。)
基于字符操作的I/O接口:Writer和Reader
基于磁盘操作的I/O接口:File
基于网络操作的I/O接口:Socket
前两组主要是传输数据的数据格式,后两组主要是传输数据的方式,虽然Socket类并不在java.io包下,但是我仍然要把它们划分在一起,因为我个人认为I/O的核心问题要么是数据格式影响I/O操作,要么是传输方式影响I/O操作,也就是将什么样的数据写到什么地方的问题。
1.1基于字节的I/O操作接口
基于字节的I/O操作接口输入和输出分别是InputStream和OutputStream
InputStream的类层次结构图(OutputStream,Writer和Reader的类层次结构图和InputStream差不多都是有很多子类可以实现不同的功能,他们的子类也相仿。):
看到这个结构图其实只想说明两点,一是操作数据的方式可以组合使用的,如这样组合:
OutputStream outputStream=new FileOutputStream("");//OutputStream可以new他的子类用于实现不同的作用。
小tip:父类作为接收类型,去new子类,称为向上转型。 子类作为接收类型,去new父类,称为向下转型。
OutputStream outputStream=new FileOutputStream("");//父类 new子类 向上转型
BufferedOutputStream bufferedOutputStream= new FileOutputStream("");//子类new父类 向下转型
二是必须要指定流最终写到什么地方,要么是写到磁盘,要么是写到网络中,其实从上面的类层次结构图中可以发现,写网络实际上也是写文件,只不过写网络还有一步需要处理,就是让底层操作系统再将数据传送到其他地方而不是本地磁盘。在后面详细介绍网络I/O和磁盘I/O。
1.2基于字符的I/O操作接口
不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符,所有I/O操作的都是字节而不是字符,但是为什么要有操作字符的I/O接口呢?因为在我们程序中通常操作的数据都是字符形式的,为了操作方便当然要提供一个直接写字符的I/O接口,如此而已。我们知道从字符到字节必须要经过编码转换,而这个编码又非常耗时,而且还会经常出现乱码问题,所以I/O的编码问题经常是让人头疼的问题。
Writer类提供了一个抽象方法write(char cbuf[], int off, int len)。
abstract public void write(char cbuf[], int off, int len) throws IOException;
Reader也提供了一个抽象方法read(char cbuf[], int off, int len),返回读到的n个字节数,不管是Writer耗时Reader类,它们都只定义了读取或写入的数据字符的方式也就是怎么写或读,但是并没有规定数据要写在哪里,这些内容就是后面要讨论的基于磁盘和网络的工作机制。
abstract public int read(char cbuf[], int off, int len) throws IOException;
1.3字节与字符的转化接口
数据持久化或网络传输都是以字节进行的,所以必须要有从字符到字节或从字节到字符的转化,从字符到字节需要转化,其中读的转化过程如下:
InputStreamReader类是从字节到字符的转化桥梁,
从InputStream到Reader的过程要指定编码字符集,否则将采用默认系统的字符集,很可能出现乱码问题。StreamDecoder正是完成从字节到字符的解码的实现类。
FileReader继承了InputStreamReader类,实际上是读取文件流,然后通过StreamDecoder解码成char,只不过这里的解码字符集是默认字符集。
写入也是类似的过程:
通过OutputStreamWriter类完成了从字节的编码过程,由StreamEncoder完成编码过程。
小tip:
Ctrl+H 显示类结构图
Ctrl+O 查看这个类的所有方法
Ctrl+鼠标左键点击 进入这个类
因为这个有点长,我还没看完I/O的工作机制所以只先发出这一段,以后再发所有, 告辞 。
深入分析Java I/O的工作机制 (一)的更多相关文章
- 深入分析 Java I/O 的工作机制--转载
Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代, ...
- 深入分析 Java I/O 的工作机制
I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 ...
- 深入分析Java I/O的工作机制 (三)网络I/O的工作机制 很详细
3.网络I/O的工作机制 前言:数据从一台主机(服务端)发送到网络中的另一台主机(客户端)需要经过很多步骤:首先需要有相互沟通的意向.其次要有能够沟通的物理渠道(物理链路):是通过电话,还是直接面对面 ...
- 深入分析Java I/O的工作机制 (二)
2.磁盘I/C工作机制 2.1几种访问文件的方式 内核空间和用户空间:内核空间是内核使用,用户空间是应用程序使用:除非编译内核要考虑内核空间,其余情况都可以按照用户空间处理.将用户空间和内核空间置于这 ...
- 第二章:深入分析java I/O的工作机制
.2.1 java的I/O类库的基本架构 I/O的机器获取和交换信息的主要渠道,在当今数据大爆炸时代,I/O问题尤其突出,很容易成为一个性能瓶颈,Java在I/O上也一直做持续的优化,现在也引入了NI ...
- 第2章 深入分析java I/O的工作机制(上)
java的I/O操作类在包java.io下,大致分成4组: 所有文件的存储都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再存储这些字节到磁盘.在读取文件时,也是一个 ...
- 第二章 深入分析Java I/O的工作机制(待续)
Java的I/O类库的基本架构 磁盘I/O工作机制 网络I/O工作机制 NIO的工作方式 I/O调优 设计模式解析之适配器模式 设计模式解析之装饰器模式 适配器模式与装饰器模式的区别
- 【深入分析Java Web技术内幕】2、深入分析Java I/O的工作机制
Java的I/O类库的基本架构 基于字节操作的IO接口:InputStream.OutputStream 基于字符操作的IO接口:Writer.Reader 基于磁盘操作的IO接口:File 基于网络 ...
- 第2章 深入分析java I/O的工作机制(下)
2.6 设计模式解析之适配器模式 2.6.1 适配器模式的结构 把一个类的接口变换成一客户端能接受的另一个接口. Target(目标接口): 要转换的期待的接口. Adaptee(源角色):需要适配的 ...
随机推荐
- Oracle通过SCN做增量备份修复DG
DG由于网络原因或者bug原因经常不同步,有时隔得时间久了,就会丢失归档日志,或者长时间的归档恢复较慢,有一种可以基于scn的方式来恢复DG库,使用基于scn的增量备份来恢复standby库可以节省大 ...
- CF Good Bye 2018
前言:这次比赛爆炸,比赛时各种想多,导致写到\(D\)题时思路已经乱了,肝了\(1\)个多小时都没肝出来,\(B\)题中途因为没开\(long\ long\)又被\(HACK\)了..\(C\)题因为 ...
- 3200 [HNOI2009]有趣的数列
题面 dalao们都说这是一题简单的卡特兰数,画一画就出来了 emmmmm…… 讲讲怎么分解质因数来算组合数 先打个表 void prim(){ ex[]=ex[]=; ;i<=*n;i++){ ...
- springboot无法加载oracle驱动终极解决
.ctrl+shirt+s .找到 Maven: com.oracle:ojdbc6: .找到classes 下的路径C:\Users\Administrator\.m2\repository\com ...
- C#读取word内容实践
C#读取word文档是如何实现的呢?我们可以使用FileStream对象来把文本文件里面的信息读取出来,但是对于word文档来说就不能使用这样的方法了. 这种情况下C#读取word文档的实现我们需要使 ...
- makefile与动态链接库案例分析——动态库链接动态库
http://blog.csdn.net/huqinwei987/article/details/50517780 背景:效率考虑,要重用把服务器主备机方案,以库Libmdpha(高可用)的形式加进主 ...
- JavaScript深拷贝
1,JSON.parse(JSON.stringify(obj)) 使用JSON实现深拷贝必须要求对象是符合JSON安全的,不了解JSON安全的自行百度. 2,lodash/underscore _ ...
- 2019.03.11 COGS2652 秘术(天文密葬法)(分数规划+长链剖分)
传送门 题意:nnn个点的树,每个点两个值a,ba,ba,b,问长度为mmm的路径∑ai∑bi\frac{\sum a_i}{\sum b_i}∑bi∑ai的最大值. 思路:一眼要01分数规划, ...
- jenkins maven git windows code 自动部署
本人刚刚接触 写的不好就对付看看吧 哈哈哈O(∩_∩)O哈哈~ 最近看见别人弄得自动部署 自己也是手痒痒 也想弄一个 所以就弄了一个 windows的 我用的是https的 在网上看了很多都是 s ...
- Solaris:你好奇的十件事
想想你周围的人,看看他们正在使用的操作系统.绝大部分人的电脑都在用主流操作系统:Windows,MacOS,甚至是Ubuntu.当说到Solaris,Unix和BSD的时候,其他人还以为你说鸟语呢.除 ...