Java I/O 总结
Java I/O的的架构使用了装饰器的模式,我们在使用流的时候需要新建很多的装饰器对象,对源数据进行层层包装。各个包装类名以及它们的应用场景比较多,初学的时候难以摸清规律,这里我把它们归一下类,方便大家记忆。
InputStream & OutputStream
InputStream 与 OuputStream是 Java 中 I/O 操作中最基本的类。
InputStream
先上类图:

类图中的类大致可以分为三个部分。
- 接口, 它包括了所有InputStream的基本操作。
- 源, 直接与各种形式的数据源直接打交道的类。对于某种特定形式的数据源,需要一种指定的InputStream来读取数据。图中几种常用的InputSream数据源类型的接口包括:
ByteArrayInputStream,StringBufferInputStream,FileInputStream,PipedInputStream,SequenceInputStream。他们的构造参数各不相同,对应的数据源也各不相同。 - 格式, 如果直接使用‘源’类型的InputStream是可以直接读取数据的, 但是读取出来的数据的类型都是byte并且没有缓存, 大部分情况下需要我们转换成其它基本类型的数据。Java 为了方便我们读取其它类型的数据提供了几种类型的装饰器。常用的几种装饰器有
DataInputStream,BufferedInputStream。其中DataInputStream允许我们读取其它基本类型数据,BufferedInputStream使用了缓存,可以提高读取的效率。
OuputStream
类图:

与InputStream类似, 它也可以分为三部分:
- 接口, 定义OutputStream的所有操作
- 目标, 这同数据源类似, 它决定了数据最终被写到哪里。它们都继承自FilterOutputStream。常用的几种形式有:
ByteArrayOutputStream,FileOutputStream,PipedOutputStream。它们分别将数据写入到内存区域,文件,管道中。 - 形式, 默认的输出全部都是以Byte的形式写入到目标中的。如果想要写入其它一些基本类型的数据或者使用缓存提高效率,可以使用其它的装饰器包裹目标的OutputStream。常用的OutputStream装饰器有
DataOutputStream,PrintStream,BufferedOuputStream, 他们的功能分别是写入基本类型, 写入换行符并清空缓存,提供了写入的目标的缓存。
Reader & Writer
InputStream & OutputStream 的重要缺陷在于不能支持Unicode。所以,Java 1.1版本中,Java I/O库中添加了这两个重要的类专门用来处理字符读写。
Reader
类图:

与InputStream的架构类似,某些继承的顺序可能略有不同。
- 接口 ,与
InputStream的操作是类似的, 只是Reader是针对字符的。 - 源, 与
InputStream相比多了一个InputStreamReader, 它可以从一个InputStream构造一个Reader。 - 格式, 与
InputStream的读入格式类似,多了可以读入字符床的操作。
Writer
类图:

- 接口,与
OuputStream类似,针对字符,多了append操作 - 目标,多了
OutputStreamWriter,允许我们通过OutputStream构造Writer。 - 格式,与Reader的格式对应,操作字符数据。
RandomAccessFile
RandomAccessFile是一个独立的类与I/O,R/W 无关。它相当于把InputStream与OutputStream结合起来使用。并添加了一些位置相关的新操作。
类图:

Java I/O 总结的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
- 论:开发者信仰之“天下IT是一家“(Java .NET篇)
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- Java多线程基础学习(二)
9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...
- Java多线程基础学习(一)
1. 创建线程 1.1 通过构造函数:public Thread(Runnable target, String name){} 或:public Thread(Runnable target ...
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
随机推荐
- ELK 经典用法—企业自定义日志手机切割和mysql模块
本文收录在Linux运维企业架构实战系列 一.收集切割公司自定义的日志 很多公司的日志并不是和服务默认的日志格式一致,因此,就需要我们来进行切割了. 1.需切割的日志示例 2018-02-24 11: ...
- WPF文本框只允许输入数字
XAML代码 < TextBox Height="23" HorizontalAlignment="Left" Margin="100,5, ...
- tms320dm6446内核启动分析
关于达芬奇DM6446,里面内部有两个部分,一个是ARM926ejs的核,还有一个是C64+DSP的视频处理核,而我需要关心的重点是arm926ejs的核(bootload和linux内核) 从boo ...
- CSDN博客添加量子恒道统计代码步骤
CSDN博客添加量子恒道统计代码步骤. 1. 去量子恒道网站统计 注册账户: 2. 添加已有的CSDN博客地址: 3. 添加博客后恒道代码里面会给你一个JavaScript脚本,记下里面的一串数字: ...
- HTML5可以省略结束标记的元素
HTML5可以省略结束标记的元素 1.dd 2.dt 3.li 4.p 5.optgroup 6.option 7.rt 8.rp 9.thread 10.tfoot 11.tr 12.td 13.t ...
- 远程块存储iSCSI
/* Border styles */ #table-2 thead, #table-2 tr { border-top-width: 1px; border-top-style: solid; bo ...
- 【原】spring boot添加cros全局过滤器
新增一个过滤器类并实现filter接口 public class CorsFilter implements Filter { final static org.slf4j.Logger logger ...
- 阿里云ECS+CentOS 7.0+Docker+Redmine环境搭建
前言 搭建Redmine环境可以选择使用分别安装Ruby+Rails+Redmine+MySQL的方式, 但是过程中需要解决各种扰人的依赖问题.Docker为我们提供的Plan B,方便,快捷. 安装 ...
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(3)
第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 第二部分: http://www.cnblogs.com/cgzl/p/8481825.html 由于 ...
- PyCharm运行报编码错误
运行报如下错误: SyntaxError: Non-ASCII character '\xe8' in file /home/ubuntu/code/201803091253-text.py on l ...