Java I/O的的架构使用了装饰器的模式,我们在使用流的时候需要新建很多的装饰器对象,对源数据进行层层包装。各个包装类名以及它们的应用场景比较多,初学的时候难以摸清规律,这里我把它们归一下类,方便大家记忆。

InputStream & OutputStream


InputStreamOuputStream是 Java 中 I/O 操作中最基本的类。

InputStream

先上类图:

类图中的类大致可以分为三个部分。

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

OuputStream

类图:

与InputStream类似, 它也可以分为三部分:

  1. 接口, 定义OutputStream的所有操作
  2. 目标, 这同数据源类似, 它决定了数据最终被写到哪里。它们都继承自FilterOutputStream。常用的几种形式有:ByteArrayOutputStream, FileOutputStream, PipedOutputStream。它们分别将数据写入到内存区域,文件,管道中。
  3. 形式, 默认的输出全部都是以Byte的形式写入到目标中的。如果想要写入其它一些基本类型的数据或者使用缓存提高效率,可以使用其它的装饰器包裹目标的OutputStream。常用的OutputStream装饰器有DataOutputStream, PrintStream, BufferedOuputStream, 他们的功能分别是写入基本类型, 写入换行符并清空缓存,提供了写入的目标的缓存。

Reader & Writer


InputStream & OutputStream 的重要缺陷在于不能支持Unicode。所以,Java 1.1版本中,Java I/O库中添加了这两个重要的类专门用来处理字符读写。

Reader

类图:

InputStream的架构类似,某些继承的顺序可能略有不同。

  1. 接口 ,与InputStream的操作是类似的, 只是Reader是针对字符的。
  2. 源, 与InputStream相比多了一个InputStreamReader, 它可以从一个InputStream构造一个Reader
  3. 格式, 与InputStream的读入格式类似,多了可以读入字符床的操作。

Writer

类图:

  1. 接口,与OuputStream类似,针对字符,多了append操作
  2. 目标,多了OutputStreamWriter,允许我们通过OutputStream构造Writer
  3. 格式,与Reader的格式对应,操作字符数据。

RandomAccessFile


RandomAccessFile是一个独立的类与I/O,R/W 无关。它相当于把InputStreamOutputStream结合起来使用。并添加了一些位置相关的新操作。

类图:

Java I/O 总结的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  3. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  4. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  8. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

  9. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

  10. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

随机推荐

  1. android技术晋升之道

    写一篇文章记录一下我看到的几个特别常见的误区,希望对团队晋升的同学能有帮助. 误区1:把特质当成案例 工作非常努力,连续一个月加班到12点,解决了问题 喜欢学习新技术和分享,团队同学都很喜欢 善于钻研 ...

  2. php字符串递增

    当递增变量是字符的时候 $a="a"; $a++; echo $a;//结果是b $a="Z"; $a++; echo $a;// 结果是AA $a=" ...

  3. Java中的表达式运算

    1.问题背景    以下代码运行的结果为:    A.a的值:8   b的值:7           B.a的值:8  b的值:8    C.a的值:9   b的值:7           D.a的值 ...

  4. jquery绑定onkeyup()事件3中方法

    $('input').keyup(function () { ... }); $('input').bind('keyup', function () { ... }); $('input').liv ...

  5. 戏说java多线程之CyclicBarrier(循环栅栏)的CyclicBarrier(int parties)构造方法

    CyclicBarrier是JDK 1.5 concurrent包出现的一个用于解决多条线程阻塞,当达到一定条件时一起放行的一个类.我们先来看这样一个简单的需求. 现在我有一个写入数据的类,继承Run ...

  6. [HDU5765]Bonds

    题面 题意 给出一张\(n\)点\(m\)边无向连通图,求每条边出现在多少个割集中. \(n\le20,m\le\frac{n(n-1)}{2}\) sol 所谓割集,就是指把\(n\)个点分成两个集 ...

  7. [BZOJ2049] [SDOI2008] Cave 洞穴勘测 (LCT)

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  8. Redis之String

    一.Redis之String简介 1. String是redis最基本的数据类型,一个key对应一个value. 2. String是二进制安全的,可以包含任何数据,例如图片或序列化的对象. 3. S ...

  9. Java 容器之Hashset 详解

    Java 容器之Hashset 详解.http://blog.csdn.net/nvd11/article/details/27716511

  10. 伯克利推出世界最快的KVS数据库Anna:秒杀Redis和Cassandra

    天下武功,唯快不破. 伯克利 RISE 实验室推出了最新的键值存储数据库 Anna,提供了惊人的存取速度.超强的伸缩性和史无前例的一致性保证.Jeff Dean 说,当一个系统增长到十倍规模时,就需要 ...