java字节流分析

InputStream常用类继承架构.jpg

InputStream 常用类继承框架

OutputStream常用类继承架构.jpg

OutputStream 常用类继承框架

想活用输入 / 输出 API ,一定要先了解 Java 中如何以串流 (Stream) 抽象化输入 / 输出概念,以及 InputStream 、 OutputStream 继承架构。如此一来,无论标准输入 / 输出、文档输入/ 输出、网络输入 / 输出、数据库输入 / 输出等都可用一致的操作进行处理。

一. 串流设计的概念

从应用程序角度来看,如果要将数据从来源取出,可以使用 输入串流 ,如果要将数据写入目的地,可以使用 输出串流 。在 Java 中,输入串流代表对象为 java.io.InputStream 实例,输出串流代表对象为 java.io.OutputStream 实例。无论数据源或目的地为何,只要设法取得 InputStream 或 OutputStream 的实例, 接下来操作输入 / 输出的方式都是一致, 无须理会来源或目的地的真正形式

二.串流处理装饰器

这里用到了设计模式里的装饰模式,其中InputStream 是抽象组件,FileInputStream,ByteArrayInputStream是具体组件,而FilterInputStream,ObjectInputStream是装饰。

2.1 BufferedInputStream 与 BufferedOutputStream

每次调用 InputStream 的 read() 方法, 都会直接向来源要求数据,每次调用 OutputStream 的 write() 方法时,都会直接将数据写到目的地,这并不是个有效率的方式。以文档存取为例,如果传入 IO.dump() 的是 FileInputStream 、 FileOutputStream 实例,每次 read() 时都会要求读取硬盘,每次 write() 时 都会要求写入硬盘,这会花费许多时间在硬
盘定位上。
如果 InputStream 第一次 read() 时 可以尽量读取足够的数据至内存的缓冲区,后续调用read() 时先看看缓冲区是不是还有数据,如果有就从缓冲区读取,没有再从来源读取数据至缓冲区,这样减少从来源直接读取数据的次数,对读取效率将会有帮助 ( 毕竟内存的访问
速度较快 ) 。
如果 OutputStream 每次 write() 时可将数据写入内存中的缓冲区,缓冲区满了再将缓冲区的数据写入目的地,这样可减少对目的地的写入次数,对写入效率将会有帮助。
BufferedInputStream 与 BufferedOutputStream 提供的就是前面描述的缓冲区功能,创建
BufferedInputStream 、 BufferedOutputStream 必须提供 InputStream 、 OutputStream 进行打包,可以使用默认或自定义缓冲区大小。

2.2 DataInputStream 与 DataOutputStream

DataInputStream 、 DataOutputStream 用来装饰 InputStream 、 OutputStream , DataInputStream 、
DataOutputStream 提供读取、 写入 Java 基本数据类型的方法, 像是读写 int 、 double 、 boolean等的方法。这些方法会自动在指定的类型与字节间转换,不用你亲自做字节与类型转换的动作。

2.3 ObjectInputStream 与 ObjectOutputStream

可以将内存中的对象整个储存下来,之后再读入还原为对象。可以使用 ObjectInputStream 、 ObjectOutputStream 装饰 InputStream 、OutputStream 来完成这项工作。
ObjectInputStream 提供 readObject() 方法将数据读入为对象,而 ObjectOutputStream 提
供writeObject() 方法将对象写至目的地,可以被这两个方法处理的对象,必须实现java.io.Serializable 接口,这个接口并没有定义任何方法,只是作为标示之用,表示这个对象是可以串行化的 (Serializable) 。
如果在做对象串行化时,对象中某些数据成员不希望被写出,则可以标上transient关键字。


参考资料

Java JDK 7学习笔记

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容