博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 的 I/O 类库的基本架构
阅读量:6174 次
发布时间:2019-06-21

本文共 1813 字,大约阅读时间需要 6 分钟。

I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。Java 在 I/O 上一直在做持续的优化,如从 1.4 开始引入了 NIO,提升了 I/O 的性能。

Java 的 I/O 操作类在包 java.io 下,但是这些类大概可以分成四组,分别是:
1.基于字节操作的 I/O 接口:InputStream 和 OutputStream;
2.基于字符操作的 I/O 接口:Writer 和 Reader;
3.基于磁盘操作的 I/O 接口:File;
4.基于网络操作的 I/O 接口:Socket,Socket类没在java.io包里。
这里只介绍字节操作和字符操作架构和字节字符转换架构,具体实现方法将会在新的文章撰写。

基于字节的 I/O 操作接口

基于字节的 I/O 操作接口输入和输出分别是:InputStream 和 OutputStream,InputStream 输入流的类继承层次如下图所示:

图片描述

输入流根据数据类型和操作方式又被划分成若干个子类,每个子类分别处理不同操作类型;

OutputStream 输出流的类层次结构也是类似,如下图所示:
图片描述

操作数据的方式是可以组合使用的,如这样组合使用:

OutputStream out = new BufferedOutputStream(new ObjectOutputStream(new FileOutputStream("fileName"));

流最终写到什么地方必须要指定,要么是写到磁盘要么是写到网络中,其实从上面的类图中我们发现,写网络实际上也是写文件,只不过写网络还有一步需要处理就是底层操作系统再将数据传送到其它地方而不是本地磁盘。

基于字符的 I/O 操作接口

不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符,所以 I/O 操作的都是字节而不是字符,但是为啥有操作字符的 I/O 接口呢?这是因为我们的程序中通常操作的数据都是以字符形式,为了操作方便当然要提供一个直接写字符的 I/O 接口,如此而已。我们知道字符到字节必须要经过编码转换,而这个编码又非常耗时,而且还会经常出现乱码问题,所以 I/O 的编码问题经常是让人头疼的问题。

Writer 相关类层次结构:

Writer 类提供了一个抽象方法 write(char cbuf[], int off, int len) 由子类去实现。
图片描述

Reader 类层次结构:

图片描述

读字符的操作接口中也是 int read(char cbuf[], int off, int len),返回读到的 n 个字节数,不管是 Writer 还是 Reader 类它们都只定义了读取或写入的数据字符的方式,也就是怎么写或读,但是并没有规定数据要写到哪去。

字节与字符的转化接口

InputStreamReader 类是字节到字符的转化桥梁,InputStream 到 Reader 的过程要指定编码字符集,否则将采用操作系统默认字符集,很可能会出现乱码问题。StreamDecoder 正是完成字节到字符的解码的实现类。也就是当你用如下方式读取一个文件时:

try {             StringBuffer str = new StringBuffer();             char[] buf = new char[1024];             FileReader f = new FileReader("file");             while(f.read(buf)>0){                 str.append(buf);             }             str.toString();  } catch (IOException e) {}

FileReader 类就是按照上面的工作方式读取文件的,FileReader 是继承了 InputStreamReader 类,实际上是读取文件流,然后通过 StreamDecoder 解码成 char,只不过这里的解码字符集是默认字符集。

写入也是类似的过程:
通过 OutputStreamWriter 类完成,字符到字节的编码过程,由 StreamEncoder 完成编码过程。

转载地址:http://qmqba.baihongyu.com/

你可能感兴趣的文章
2018 AICCSA Programming Contest
查看>>
AtCoder Regular Contest 083
查看>>
Educational Codeforces Round 31
查看>>
第七章
查看>>
[AGC008F]Black Radius
查看>>
站内搜索
查看>>
IIS网站服务器性能优化攻略
查看>>
heroku安装和nodejs程序部署
查看>>
linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)
查看>>
javascript 学习笔记
查看>>
best introduction to camera calibration
查看>>
VC++排序 排序算法比较
查看>>
HBuilder生成代码行快捷键
查看>>
鼠标光标聚焦到可编辑div的最末尾
查看>>
Hangover(1.4.1)
查看>>
微服务系列(一):微服务架构的优势与不足
查看>>
windows和linux双系统删除linux
查看>>
变量的默认初始化和值初始化
查看>>
python分号使用
查看>>
qt事件机制(转)
查看>>