java 的IO类库的基本架构
java IO 操作的类在java.io 包中,大概可以分为以下几组:
- 基于字节操作的接口:InputStream 和 OutputStream
- 基于字符操作的接口:Writer 和 Reader
- 基于磁盘操作的接口:File 相关
- 基于网络操作的接口:Socket 相关
前两个是数据格式区分,后两个是传输方式区分。IO 只是人机交互的手段,除了完成交互功能,我们关注的就是如何提高他的运行效率了,而数据格式和传输方式是影响效率的最关键的因素。
基于字节操作的接口
以下是 InputStream 的类层次关系图
其实还有很多子类没有展示出来,每个子类对应处理不同的操作类型。
以下是 OutputStream 的类层次关系图
两个要点:
- 1、操作数据的方式可以组合使用
- 2、必须制定流最终写到什么地方:要么是磁盘,要么是网络中。其实写网络也是写磁盘,只是需要让操作系统再将数据传送到其他地方,而不是本地磁盘。
基于字符操作的接口
不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符,所以IO操作的都是字节而不是字符,但是为什么有操作字符的IO接口呢?
这是因为我们程序操作的数据都是字符形式的,为了方便操作当然要提供直接写字符的IO接口。
Writer 类层次结构
Reader 类层次结构
Reader 和 Writer 接口都只定义了读取或写入数据字符的方式,也就是怎么读或写,但是没有指明数据要写到哪里,这里就涉及到磁盘或网络的工作机制。
字节和字符转化接口
前面说过,数据持久化或网络传输都是以字节为单位进行,所以必须有字符字节转化工具。
字符编码类结构如图,解码有类似的结构;
从InputStream 到 Reader 的过程要指定编码字符集,否则使用系统默认的字符集,很可能会出现乱码问题。StreamDecoder 正是完成从字节到字符的解码的实现类。
try {
StringBuffer buffer = new StringBuffer();
char[] buf = new char[1024];
FileReader reader = new FileReader("file");
while (reader.read(buf) > 0) {
buffer.append(buf);
}
buffer.toString();
} catch (Exception e) {
}
FileReader 就是按照上面的工作方式读取文件的,FileReader 继承了 InputStreamReader ,实际上是读取文件流,然后通过StreamDecoder 解码成 char,只不过这里的解码字符集是默认字符集。
通过 OutputStreamWriter 类完成了从字符到字节的编码过程,由 StreamEncoder 完成编码过程。
java 的IO类库的基本架构的更多相关文章
- java IO 类库的基本架构
I/O问题是任何编程语言都无法回避的问题,可以说I/O问题是整个人机交互的核心问题,因为I/O是机器获取和交换信息的主要渠道,在当今这个数据大爆炸时代,I/O问题尤为突出,很容易成为一个性能瓶颈.正因 ...
- Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库
http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...
- Java 的 I/O 类库的基本架构
Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代, ...
- Java I/O 工作机制(一) —— Java 的 I/O 类库的基本架构
Java 的 I/O 类库的基本架构 Java 的 I/O 操作类在包 java.io 下,有将近 80 个类. 按数据格式分类: 面向字节(Byte)操作的 I/O 接口:InputStream 和 ...
- JAVA IO 类库详解
JAVA IO类库详解 一.InputStream类 1.表示字节输入流的所有类的超类,是一个抽象类. 2.类的方法 方法 参数 功能详述 InputStream 构造方法 available 如果用 ...
- 2.熟悉Java基本类库系列——Java IO 类库
Java中常用的IO操作基本上可以分为四大部分,分别是:File类操作.RandomAccessFile类操作.字节流操作.字符流操作.只要熟练掌握了本文中所列举的所有例子,基本上对于Java的IO流 ...
- 许令波老师的java的IO机制分析文章
深入分析 Java I/O 的工作机制 I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可 ...
- Atitit java onvif 开源类库 getProfiles getStreamUri
Atitit java onvif 开源类库 getProfiles getStreamUri 1. ONVIF Java Library by Milgo1 1.1. https://github. ...
- Java以基础类库
Java以基础类库JFC(Java Foundation Class)的形式为程序员提供编程接口API,类库中的类按照用途归属于不同的包中. (一)java.lang包 Java最常用的包都属于该包, ...
随机推荐
- 【mq读书笔记】定时消息
mq不支持任意的时间京都,如果要支持,不可避免的需要在Broker层做消息排序,加上持久化方面的考量,将不可避免地带来巨大的性能消耗,所以rocketMQ只支持特定级别的延迟消息. 在Broker短通 ...
- Apache Beam,批处理和流式处理的融合!
1. 概述 在本教程中,我们将介绍 Apache Beam 并探讨其基本概念. 我们将首先演示使用 Apache Beam 的用例和好处,然后介绍基本概念和术语.之后,我们将通过一个简单的例子来说明 ...
- Mysql主从同步机制
1.1 主从同步介绍和优点 *在多台数据服务器中,分为主服务器和从服务器.一台主服务器对应多台从服务器. *主服务器只负责写入数据,从服务器只负责同步主服务器的数据,并让外部程序读取数据 *主服务器写 ...
- 学习笔记(1):零基础掌握 Python 入门到实战-列表与元祖到底该用哪个?(二)...
立即学习:https://edu.csdn.net/course/play/26676/338778?utm_source=blogtoedu 列表不能通过增加索引增加元素 可以使用list中的app ...
- go语言之---数组(array)和切片(slice)
一.数组 1.什么是数组? 1.数组是一系列同一类型数据的集合 2.数组中包含的每个数据被称为数组元素 3.一个数组中包含的元素个数成为数组长度 4.数组的长度是固定的 5.一个数组可以由零个或者多个 ...
- 腾讯牛逼!终于开源了自家的 Tencent JDK——Kona!!.md
是的,继阿里 2019/03 开源基于 OpenJDK 的长期支持版本 Alibaba Dragonwell 之后,腾讯也发布了自家的开源免费的 JDK 版本--Tencent Kona,必须替小马哥 ...
- 第9.4节 Python中用readline读取二进制文件方式打开文件
在<第9.3节 Python的文件内容读取:readline>中介绍了使用readline读取文件的处理,readline除了使用文本文件方式打开文件读外,也可以读取二进制方式打开的文件, ...
- 使用Promise实现红绿灯交替重复亮
红灯3秒亮一次,黄灯2秒亮一次,绿灯1秒亮一次:如何让三个灯不断交替重复亮灯?(用Promise实现) function red() { console.log('red'); } function ...
- 题解-SHOI2005 树的双中心
SHOI2005 树的双中心 给树 \(T=(V,E)(|V|=n)\),树高为 \(h\),\(w_u(u\in V)\).求 \(x\in V,y\in V:\left(\sum_{u\in V} ...
- Java并发编程的艺术(五)——线程和线程的状态
线程 什么是线程 操作系统调度的最小单元就是线程,也叫轻量级进程. 为什么要使用多线程 多线程程序能够更有效率地利用多处理器核心. 用户响应时间更快. 方便程序员将程序模型映射到Java提供的多线程编 ...