面试必备:详解Java I/O流,掌握这些就可以说精通了?

IO就是输入/输出。Java IO类库基于抽象基础类InputStream和OutputStream构建了一套I/O体系,主要解决从数据源读入数据和将数据写入到目的地问题。我们把数据源和目的地可以理解为IO流的两端。当然,通常情况下,这两端可能是文件或者网络连接。

我们用下面的图描述下,加深理解:

从一种数据源中通过InputStream流对象读入数据到程序内存中

在这里插入图片描述

在这里插入图片描述

当然我们把上面的图再反向流程,就是OutputStream的示意了。

在这里插入图片描述

在这里插入图片描述

其实除了面向字节流的InputStream/OutputStream体系外,Java IO类库还提供了面向字符流的Reader/Writer体系。Reader/Writer继承结构主要是为了国际化,因为它能更好地处理16位的Unicode字符。

在学习是这两套IO流处理体系可以对比参照着学习,因为有好多相似之处。

要理解总体设计

刚开始写IO代码,总被各种IO流类搞得晕头转向。这么多IO相关的类,各种方法,啥时候能记住。

其实只要我们掌握了IO类库的总体设计思路,理解了它的层次脉络之后,就很清晰。知道啥时候用哪些流对象去组合想要的功能就好了,API的话,可以查手册的嘛。

首先从流的流向上可以分为输入流InputStream或Reader,输出流OutputStream或Writer。任何从InputStream或Reader派生而来的类都有read()基本方法,读取单个字节或字节数组;任何从OutputSteam或Writer派生的类都含有write()的基本方法,用于写单个字节或字节数组。

从操作字节还是操作字符的角度,有面向字节流的类,基本都以XxxStream结尾,面向字符流的类都以XxxReader或XxxWriter结尾。当然这两种类型的流是可以转化的,有两个转化流的类,这个后面会说到。

一般在使用IO流的时候会有下面类似代码:

1 FileInputStream inputStream = new FileInputStream(new File("a.txt"));
2 BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

这里其实是一种装饰器模式的使用,IO流体系中使用了装饰器模式包装了各种功能流类。不了解装饰器模式的看下这篇【详解设计模式】-装饰者模式

在Java IO流体系中FilterInputStream/FilterOutStream和FilterReader/FilterWriter就是装饰器模式的接口类,从该类向下包装了一些功能流类。有DataInputStream、BufferedInputStream、LineNumberInputStream、PushbackInputStream等,当然还有输出的功能流类;面向字符的功能流类等。

下面几张图描述了整个IO流的继承体系结构

InputStream流体系

在这里插入图片描述

在这里插入图片描述

OutputStream流体系

在这里插入图片描述

在这里插入图片描述

Reader体系

在这里插入图片描述

在这里插入图片描述

Writer体系

在这里插入图片描述

在这里插入图片描述

最后再附加一张表加深印象:

在这里插入图片描述

在这里插入图片描述File其实是个工具类

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypwdw.html