在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 字节流与字符流
文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节. ...
- java io系列01之 "目录"
java io 系列目录如下: 01. java io系列01之 "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...
- 高级Java工程师必备 ----- 深入分析 Java IO (三)
概述 Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO( ...
- java.io包的总体框架图(转)
原文链接:java.io包的总体框架图, 便于记忆!
- java IO框架分析
jave.io框架 2010-11-10 22:18:34| 分类: 默认分类|举报|字号 订阅 可从IO的类层次,IO框架的设计模式来论述. 总体来说,IO可以分为字节流和字符流,不同在于 ...
- Java IO与网络编程笔记
<!doctype html>Java IO&NIO figure:first-child { margin-top: -20px; } #write ol, #write ul ...
- java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例
本章,我们对java 管道进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_04.html java 管道介绍 在java中,PipedOu ...
- 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 ...
- Netty学习二:Java IO与序列化
1 Java IO 1.1 Java IO 1.1.1 IO IO,即输入(Input)输出(Output)的简写,是描述计算机软硬件对二进制数据的传输.读写等操作的统称. 按照软硬件可分为: 磁盘I ...
- JAVA IO 序列化与设计模式
➠更多技术干货请戳:听云博客 序列化 什么是序列化 序列化:保存对象的状态 反序列化:读取保存对象的状态 序列化和序列化是Java提供的一种保存恢复对象状态的机制 序列化有什么用 将数据保存到文件或数 ...
随机推荐
- avalon,xmp
- SpringMVC 教程 - URI 链接
原文链接:https://www.codemore.top/cates/Backend/post/2018-04-22/spring-mvc-uri-links 这一节主要讲的是Spring Fram ...
- 一口一口吃掉Hibernate(四)——多对一单向关联映射
hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的.一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它. 今天就 ...
- Python小代码_3_购物车
product_list = [ ('MacBook', 9000), ('kindle', 500), ('tesla', 900000), ('book', 100), ('bike', 2000 ...
- JQuery 分页显示jquery-pager-1.0.js
原版是jquery-pager-1.0.js,经过变更修改加上按照项目中的一些需要修改过来. //初始化分页控件 PagerOptions为配置参数 url为要提交的url地址,如果不需要提交则可以为 ...
- Java语言程序设计-Markdown格式作业模板
Markdown格式作业模板如下,大家可以直接复制粘贴使用. 注意:作业中不能只写答案,题目本身也要出现.. # 1. 本章学习总结 你对于本章知识的学习总结 # 2. 书面作业 **Q1 java ...
- Java对象的访问定位
java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象.由于reference类型在java虚拟机规范中只规定了一个对象的引用,并没有定义这个这个引用应该 ...
- Weblogic 12c 集群环境搭建
本文是在windows7操作系统下配置的,jdk版本1.7 ,weblogic版本12.1.3.0.0. 搭建集群前的规划 其中AdminServer是总控制端,server1.server2.ser ...
- Xcode 中的断言
转自:http://weibo.com/p/100808885591f113cdedc3301794e5e7d7e9f0/home?from=page_100808&mod=TAB#_rnd1 ...
- 如何在控制台切换Xcode的版本
打开控制台,输入 xcode-select -p 你可以看到当前Xcode所使用的版本路径,比如本猫的输出为: /Applications/Xcode-beta.app/Contents/Develo ...