I/O问题是任何编程语言都无法回避的问题,可以说I/O问题是整个人机交互的核心问题,因为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操作。I/O只是人机交互的的手段,我们除了关注功能外,还应该关注的就是如何提高它的运行效率。

基于字节的 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 类提供了一个抽象方法 write(cahr cbuf[], int off, int len)。

读字符的操作接口也有类似的类结构,读字符的操作接口是 int read(cahr 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);
}
}catch(Exception e){}

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

  写入也是类似的过程。

java IO 类库的基本架构的更多相关文章

  1. JAVA IO 类库详解

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

  2. java 的IO类库的基本架构

    java IO 操作的类在java.io 包中,大概可以分为以下几组: 基于字节操作的接口:InputStream 和 OutputStream 基于字符操作的接口:Writer 和 Reader 基 ...

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

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

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

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

  5. Java IO流学习

    Java IO流学习 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是 ...

  6. 1.熟悉Java基本类库系列 - 目录

    写这个系列是想让自己多熟悉熟悉Java的基本类库,忘记的时候可以在这里看看之前写过的例子,这样就可以很快的回忆起来如何使用了. 这样就可以很节省时间了. ======= 下面是传送门啦 ======= ...

  7. 高级Java工程师必备 ----- 深入分析 Java IO (三)

    概述 Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO( ...

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

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

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

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

随机推荐

  1. Core Animation 文档翻译 (第一篇)

    Core Animation 文档翻译(第一篇)   2018-01-13  星期6 前言:作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前的应用 ...

  2. Jmeter发送JDBC请求

    下午花了两个小时研究了一下Jmeter发送JDBC请求,现在把基本操作流程分享一下. 做JDBC请求,首先需要两个jar包:mysql驱动-mysql-connector-java-5.1.13-bi ...

  3. java多线程之守护线程以及Join方法

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.守护线程概述及示例 守护线程就是为其它线程提供"守护"作用,说白了就是为其它线程服务的,比如GC线程. java程序中线程分 ...

  4. 移动端mobiscroll时间插件的调用

    话不多说直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  5. 带新手走进神秘的HTTP协议

    在开发的时候经常需要访问网络,比如Android就有好多这方面的框架:Volley.OkHttp.Retrofit等,当你看这些框架源码时,可能会很好奇关于http的部分,它的首部字段是什么意思,ht ...

  6. 如何删除chrome地址栏里面曾经输错的地址

    在chrome浏览器的地址栏输入你想删除的网址的部分字幕,比如,在地址栏输入form,然后用键盘上的方向键定位到你想删除的那个错误的地址,如下图所示   然后在键盘上按 shift+del 组合键将其 ...

  7. centos6.x升级protobuf操作流程.

    1.首先卸载protobuf,使用命令如下: sudo yum remove protobuf 2.下载protobuf源,依据自己的需要下载: 2.1下载地址:https://github.com/ ...

  8. Matlab与C++混合编程(依赖OpenCV)

    Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...

  9. zookeeper伪分布式集群环境搭建

    step1.下载 下载地址:http://zookeeper.apache.org/releases.html 将下载的压缩包放到用户家目录下(其他目录也可以) step2.解压 $tar –zxvf ...

  10. MkDocs项目文档生成器

    简介 安装 我的配置 Chocolatey 简介 - Windows的包管理器 官方网址 安装 注意事项 Python 简介 安装 Pip 简介-Python的包管理器 升级 MkDocs的安装 使用 ...