在Java IO中我们会经常提到输入流和输出流,流是一种抽象的数据总称,本质是能够进行数据的传输。按照流的方向分为:输入流和输出流。按照流中处理数据的单位,可以将其区分为:字节流和字符流。在Java中,字节就是1个Byte,8位,而字符是占2个Byte,16位,字节是有符号类型,字符是无符号类型的。
接下来分别讨论输入流、输出流、字节流和字符流。

一、以字节为单位的输入流的框架图:

从上图我们可以看出以字节为单位的输入流的公共父类是InputStream:
(1)InputStream是以字节为单位的输入流的超类,InputStream提供了接口从输入流中读取字节数据。
(2)ByteArrayInputStream是字节数组输入流,它的内部缓冲区是一个字节数组,本质是通过字节数组来是实现的。
(3)PipedInputStream是管道输入流,能够实现多线程间的管道通信。
(4)FilterInputStream是过滤输入流,它是DataInputStream和BufferedInputStream的超类。
(5)DataInputStream是数据输入流,用来装饰其他输入流,允许应用程序以与机器无关方式从底层输入流中读取基本Java数据类型。
(6)BufferedInputStream是缓冲输入流,作用是为另一个输入流添加缓冲功能。
(7)FileInputStream是文件输入流,通常用于对文件进行读取操作。
(8)File是文件和目录路径名的抽象表示形式,File不仅仅表示文件,也可以表示目录,它的超类是Object。
(9)FileDescriptor是文件描述符,用来表示开放文件,开放套接字等。
(10)ObjectInputStream是对象输入流,和ObjectOutputStream一起来对基本数据或对象进行持久存储。

二、以字节为单位的输出流的框架图:

从中我们可以看出,以字节为单位的输出流的公共父类是OutputStream:
(1)OutputStream是以字节为单位的输出流的超类,提供了write()函数从输出流中读取字节数据。
(2)ByteArrayOutputStream是字节数组输出流,写入ByteArrayOutputStream的数据被写入到一个byte数组,缓冲区会随着数据的不断写入而自动增长,可使用toByteArray()和toString()获取数据。
(3)PipedOutputStream是管道输出流,和PipedInputStream一起使用,能实现多线程间的管道通信。
(4)FilterOutputStream是过滤输出流,是DataOutputStream,BufferedOutputStream和PrintStream的超类
(5)DataOutputStream是数据输出流,用来装饰其他的输出流,允许应用程序以与机器无关方式向底层写入基本Java数据类型。
(6)BufferedOutputStream是缓冲输出流,它的作用是为另一个输出流添加缓冲功能。
(7)PrintStream是打印输出流,用来装饰其他输出流,为其他输出流添加功能,方便的打印各种数据值
(8)FileOutputStream是文件输出流,通常用于向文件进行写入操作。
(9)ObjectOutputStream是对象输出流,它和ObjectInputStream一起对基本数据或者对象的持久存储。

三、以字节为单位的输入流和输出流关联的框架图
输入流和输出流都有对应的关系,如图:


四、以字符为单位的输入流的框架图:

从图我们可以看出,以字符为单位的输入流的公共类是Reader。
(1)Reader是以字符为单位的输入流的超类,它提供了read()接口来取字符数据。
(2)CharArrayReader 是字符数组输入流,用于读取字符数组,继承于Reader。操作的数据是以字符为单位。
(3)PipedReader 是字符类型的管道输入流,它和PipedWriter一起可以通过管道进行进程间的通讯,在使用管道通信时,必须将PipedWriter和PipedReader配套使用。
(4)FilterReader是字符类型的过滤输入流。
(5)BufferedReader是字符缓冲输入流,作用是为另一个输入流添加缓冲功能。
(6)InputStreamReader是字节转字符的输入流,它是字节流通向字符流的桥梁。
(7)FileReader是字符类型的文件输入流,通常用于对文件进行读取操作。

五、以字符为单位的输出流的框架图:

从图中可以看出,Writer是所有字符输出流的超类。
(1)Writer是以字符为单位的输出流的超类,它提供了writer()函数,进行对字符的写。
(2)CharArrayWriter是字符数组输出流,用于读取字符数组,继承于Writer,操作数据的单位是字符。
(3)PipedWriter是字符类型的管道输出流,它和PipedReader一起是可以通过管道进行线程间的通讯,在使用管道通信时,必须将PipedReader和PipedWriter配套使用。
(4)FilterWriter是字符类型的过滤输出流。
(5)BufferedWriter是字符缓冲输出流,作用是为另一个输出流添加缓冲功能。
(6)OutStreamWriter是字节转字符的输出流,是字节通向字符流的桥梁。
(7)FileWriter 是字符类型的文件输出流。
(8)File,获取文件或者目录对象
(9)PrintWriter是字符类型的打印输出,用来装饰其他输出流,能为其他的输出流添加功能。

六、以字符为单位的输入流和输出流关联的框架图:

七、字节转换为字符流的框架图

在java中,字节流能转换为字符流,转换关系图

从上图可以看出:
(1)FileReader继承于InputStreamReader,而InputStreamReader依赖于InputStream,因为InputStreamReader的构造函数是以InputStream为参数,传人InputStream会在InputStreamReader内部通过转码,将字节转换成字符。
(2)FileWriter继承于OutputStreamWriter,而OutStreamWriter依赖于OutputStream,因为OutputStreamWriter的构造函数是以OutputStream为参数,我们传人OutputStream会在OutputStreamWriter内部通过转码,将字节转换成字符。

八、字节和字符的输入流对应关系:



九、字节和字符的输出流对应关系



Java-IO之总框架的更多相关文章

  1. JAVA IO 字节流与字符流

    文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.     ...

  2. java io系列01之 "目录"

    java io 系列目录如下: 01. java io系列01之  "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...

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

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

  4. java.io包的总体框架图(转)

    原文链接:java.io包的总体框架图, 便于记忆!

  5. java IO框架分析

    jave.io框架 2010-11-10 22:18:34|  分类: 默认分类|举报|字号 订阅     可从IO的类层次,IO框架的设计模式来论述. 总体来说,IO可以分为字节流和字符流,不同在于 ...

  6. Java IO与网络编程笔记

    <!doctype html>Java IO&NIO figure:first-child { margin-top: -20px; } #write ol, #write ul ...

  7. java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例

    本章,我们对java 管道进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_04.html java 管道介绍 在java中,PipedOu ...

  8. cloudera-scm-server启动时出现Caused by: java.io.FileNotFoundException: /var/lib/cloudera-scm-server/.keystore (No such file or directory)问题解决方法(图文详解)

    不多说,直接上干货! 问题详情 查看/var/log/cloudera-scm-server.log的启动日志 问题来源 我在用cloudermanager安装好之后,然后,在对如下. 配置kerbe ...

  9. Netty学习二:Java IO与序列化

    1 Java IO 1.1 Java IO 1.1.1 IO IO,即输入(Input)输出(Output)的简写,是描述计算机软硬件对二进制数据的传输.读写等操作的统称. 按照软硬件可分为: 磁盘I ...

  10. JAVA IO 序列化与设计模式

    ➠更多技术干货请戳:听云博客 序列化 什么是序列化 序列化:保存对象的状态 反序列化:读取保存对象的状态 序列化和序列化是Java提供的一种保存恢复对象状态的机制 序列化有什么用 将数据保存到文件或数 ...

随机推荐

  1. python2.7练习小例子(一)

        1)题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少?     程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去掉不满足条件的 ...

  2. windows server 2008 R2 禁用ipv6和隧道适配器

    在windows server 2008 R2操作系统下部署weblogic web application,部署完成后进行测试,发现测试页的地址使用的是隧道适配器的地址,而不是静态的ip地址,而且所 ...

  3. new File()

    首先 File 类是对文件系统的映射 并不是硬盘上真实的文件所以 new File("xxx.xxx") 只是在内存中创建File文件映射对象,而并不会在硬盘中创建文件 如果需要创 ...

  4. YARN整理

    YARN整理 1.YARN的介绍 是一个资源管理.任务调度的框架,主要包含三大模块: ResourceManager(RM):负责所有资源的监控.分配和管理 ApplicationMaster(AM) ...

  5. 基于babylon3D模型研究3D骨骼动画(1)

    3D骨骼动画是实现较为复杂3D场景的重要技术,Babylon.js引擎内置了对骨骼动画的支持,但Babylon.js使用的骨骼动画的模型多是从3DsMax.Blender等3D建模工具转换而来,骨骼动 ...

  6. OpenCV设置摄像头分辨率及全屏显示

    OpenCV3.0下 设置摄像头分辨率为1920*1440,并全屏显示图像窗口. int _tmain(int argc, _TCHAR* argv[]) { Mat frame; VideoCapt ...

  7. 剑指架构师系列-ActiveMQ队列的使用

    安装ActiveMQ只需要下载包后解压,然后就可以启动与关闭ActiveMQ了,如下: ./activemq start ./activemq stop 访问管理页面: http://10.10.20 ...

  8. AIX 命令

    1,[ctrl]+h 删除命令 2, set -o emacs后: [ctrl]+p 看上条命令 [ctrl]+n 看下条命令 两次[esc] 自动补全 3, set -o vi 后,可以按照vi编辑 ...

  9. Jupyter Notebook 添加目录

    1.  安装 jupyter_contrib_nbextensions pip install jupyter_contrib_nbextensions 2. 配置 nbextension jupyt ...

  10. [Gradle系列]Gradle打包apk多版本,多渠道,多环境,多功能,多模块随心所欲

    Tamic: http://blog.csdn.net/sk719887916/article/details/53411771 开始 上篇Gradle发布Module(Maven)到jcenter, ...