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. python环境jieba分词的安装

    我的python环境是Anaconda3安装的,由于项目需要用到分词,使用jieba分词库,在此总结一下安装方法. 安装说明======= 代码对 Python 2/3 均兼容 * 全自动安装:`ea ...

  2. apue.h头文件(UNIX环境高级编程)

    在看UNIX环境高级编程是,碰到一个头文件"apue.h",搜一下别人的帖子,其实apue.h是作者自己写的一个文件,包含了常用的头文件,系统不自带.其中包含了常用的头文件,以及出 ...

  3. ActiveMQ安装及启动

    最近项目组遇到MQ的问题(项目组用的IBM MQ),突然想回来看看MQ.本来就不是太熟练,闲来无事写写看看. 不多说,首先是安转ActiveMQ,官方网址:http://activemq.apache ...

  4. SQL注入攻击三部曲之入门篇

    SQL注入攻击三部曲之入门篇 服务器安全管理员和攻击者的战争仿佛永远没有停止的时候,针对国内网站的ASP架构的SQL注入攻击又开始大行其道.本篇文章通过SQL注入攻击原理引出SQL注入攻击的实施方法, ...

  5. JavaScript中的indexOf

    JavaScript中的indexOf 1.JavaScript中利用indexOf拼接字符串 <%@ page language="java" import="j ...

  6. Codeforces Round #427 (Div. 2) D - Palindromic characteristics

    本题是个简单的区间dp 最近都没时间做题了,被我妈强制喊回去,然后颓废了10天(回家也没发控制住自己= = 我的锅),计划都打乱了,本来还报名了百度之星,然后没时间参加 #include<cma ...

  7. spoj freetour II

    昨天吐槽还没A,今天就A了 有个变量开成了全局变量,应该携程局部变量 对于中间的solve我也不懂为什么是nlog2n,我不看题解也不会做 #include<bits/stdc++.h> ...

  8. python 字符串格式化输出 %d,%s及 format函数

    旧式格式化方式:%s,%d 1.顺序填入格式化内容 s = "hello %s, hello %d"%("world", 100) print(s) 结果: ' ...

  9. MessageFormat.format用法

    用法一: package gacl.request.study; import java.io.IOException; import java.text.MessageFormat; import ...

  10. 异常-----freemarker.core.NonStringException

    一,案例一 1.1.错误描述 <html> <head> <meta http-equiv="content-type" content=" ...