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类库的基本架构的更多相关文章

  1. java IO 类库的基本架构

    I/O问题是任何编程语言都无法回避的问题,可以说I/O问题是整个人机交互的核心问题,因为I/O是机器获取和交换信息的主要渠道,在当今这个数据大爆炸时代,I/O问题尤为突出,很容易成为一个性能瓶颈.正因 ...

  2. Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库

    http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...

  3. Java 的 I/O 类库的基本架构

    Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代, ...

  4. Java I/O 工作机制(一) —— Java 的 I/O 类库的基本架构

    Java 的 I/O 类库的基本架构 Java 的 I/O 操作类在包 java.io 下,有将近 80 个类. 按数据格式分类: 面向字节(Byte)操作的 I/O 接口:InputStream 和 ...

  5. JAVA IO 类库详解

    JAVA IO类库详解 一.InputStream类 1.表示字节输入流的所有类的超类,是一个抽象类. 2.类的方法 方法 参数 功能详述 InputStream 构造方法 available 如果用 ...

  6. 2.熟悉Java基本类库系列——Java IO 类库

    Java中常用的IO操作基本上可以分为四大部分,分别是:File类操作.RandomAccessFile类操作.字节流操作.字符流操作.只要熟练掌握了本文中所列举的所有例子,基本上对于Java的IO流 ...

  7. 许令波老师的java的IO机制分析文章

    深入分析 Java I/O 的工作机制 I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可 ...

  8. Atitit java onvif 开源类库 getProfiles getStreamUri

    Atitit java onvif 开源类库 getProfiles getStreamUri 1. ONVIF Java Library by Milgo1 1.1. https://github. ...

  9. Java以基础类库

    Java以基础类库JFC(Java Foundation Class)的形式为程序员提供编程接口API,类库中的类按照用途归属于不同的包中. (一)java.lang包 Java最常用的包都属于该包, ...

随机推荐

  1. cobbler 装机服务

    一.Cobbler 安装 $ yum install -y epel-release $ yum install -y cobbler cobbler-web pykickstart debmirro ...

  2. eNSP VLAN划分基础配置及Access接口

    交换机内实现VLAN通信拓扑图: 一.修改主机名并保存 1.进入系统视图模式(配置模式) <Huawei>system-view 2.sysname命令修改主机名为yanyuda [Hua ...

  3. Django 2版本

    django2.0里面的path第一个参数不支持正则,你写什么就匹配,100%精准匹配 django2.0里面的re_path对应着django1.0里面的url 虽然django2.0里面的path ...

  4. Docker 跨平台在 netCore 中的从入门到部署

    前言 从题目我们可以看的出,今天是五部曲的第三部,你可能会好奇,为啥没有见到前两部呢?这里我简单说下: 1.跨平台第一部曲:MySql 如果你看我的所有开源项目,应该能发现我已经全部迁移到了Mysql ...

  5. Python中函数的参数带星号是什么意思?

    参数带星号表示支持可变不定数量的参数,这种方法叫参数收集. 星号又可以带1个或2个,带1个表示按位置来收集参数,带2个星号表示按关键字来收集参数. 1.带一个星号的参数收集模式: 这种模式是在函数定义 ...

  6. PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法大全及对比分析

    一. 概述 PyQt的图形界面应用中,事件处理类似于Windows系统的消息处理.一个带图形界面的应用程序启动后,事件处理就是应用的主循环,事件处理负责接收事件.分发事件.接收应用处理事件的返回结果, ...

  7. 本地web项目部署到服务器里连接不上数据库的解决办法

    今天突然想到把自己之前的项目挂到服务器上,但是用到了数据库,于是给服务器装上了MySQL,想着能赶紧把项目挂上去看看效果,然后并不是一帆风顺,在奋斗了四小时后终于解决了问题的所在. (1)首先我找到了 ...

  8. edusrc电子科技大学证书

  9. js实现跳转的几种方式

    1. window.open("url"); 2.用自定义函数 <script> function openWin(tag,obj) { obj.target=&quo ...

  10. 【题解】「P6832」[Cnoi2020]子弦

    [题解]「P6832」[Cnoi2020]子弦第一次写月赛题解( 首先第一眼看到这题,怎么感觉要用 \(\texttt{SAM}\) 什么高科技的?结果一仔细读题,简单模拟即可. 我们不难想出,出现最 ...