Java I/O 总结详细教程


www.moandroid.com Java I/O总结   从new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的  Java I/O总结——InputStream  Java I/O总结——OutputStream  Java I/O总结——Reader  Java I/O总结——Writer  Java I/O总结——补充说明 从new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的 从 new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的?晚上睡在床 上,这一小段代码在我的脑海里不断浮现,因为它 看上去有些相似(在设计模式中的看到过类 似),但是实在想不起与那个模式相似了? 翻开设计模式书,已经好久没有看到过本书了,说实话对这本书中的大多数还不是很了解,但是 此刻看到能让我想到了,说明这个模式给我留下了深刻的影 响。翻开书找了半天,我一直以为 是 Strategy,后来看了下不是的,从头看到尾,终于找到了 Decorator(装饰)。把这个设计模 式又仔细读了一 遍,在这里与大家分享。 设计意图 动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator 模式相比较生产子类更为 灵活。 设计动机 有时候我们希望给某个对象增加而不是整个类增加一些功能,例如,给一个图像界面工具箱允许 你对人员一个用户界面的组件添加一些特性,比如说边框,或者窗口滚动。 使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例 所实现。但是这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式 和时机。 一种较为灵活的方式是将组件嵌入另外一个对象中,由这个对象添加边框,我们称这个嵌入的对 象为装饰。 结构 mo-Android 感受 Android 带给我们的新体验 www.moandroid.com 代码部分我们就不详细说明,如下图所示: 这张图当时好象是我学习设计模式中,看的最清楚的一张(难得啊,设计模式中的那么多图,很 多当时看的时候都不是很明白),当然这张图不是我最在意的。 Decorator 模式的经典使用 Streams 是大多数 I/O 设备的基础抽象对象,它提供了将对象转换为字符或字符流的操作接口, 使得我们可以将一个对象转换成另外一个文件或者内存中的字符串,可以在以后恢复中使用。说 了这么多,估计大家也不是很明白,看了下面这张图估计你就明白了: mo-Android 感受 Android 带给我们的新体验 www.moandroid.com 看了上面这张图,我记得当时顿时对 C++中的那么多 XXXInputStream,XXXXOutputStream 明白 了很多。对上面这很张图稍 微解释:Stream 抽象类位置一个内部缓冲区并提供一些操作 (PutInt,PutString)用于将数据存入流中,一段这个缓冲区满 了,Stream 就会调用抽象操 作 HandleBufferFull 进行实际数据传递,在FileStream 中重定义这个操作,将缓冲区的数据传 递到文 件中去。 这里的关键类是 StreamDecorator,它维持了一个指向组件流的指针并将请求转发给它, StreamDecorator 子类重定义 HandleBufferFull()操作并且在调用 StreamDecorator 的 HandleBufferFull 操作之前执行一些额外的动作。 例如:CompressingStream 子类用于压缩数据,而 ASCII7Stream 将数据转换成7位 ASICC 码, 现在我们创建 FileStream 类,它首先将数据压缩,然后将压缩了的二进制数据转换为7 位 ASICC 码,我们用 CompressingStream 和 ASCII7Stream 装饰 FileStream: Sream *aStream = new CompressingStream( new ASCII7Stream( mo-Android 感受 Android 带给我们的新体验 www.moandroid.com mo-Android 感受 Android 带给我们的新体验 new FileStream(“aFileName”) ) ); aStream->PutInt(12); aStream->PutString(“www.moandroid.com”); 记得当时给我印象最深的就是在这个地方,突然间让我明白了很多。 总结说明 很早以前看到这个地方,感受颇深,今天再次看到这个地方,一方面时间已经过去了很多,另外 一方面对问题的理解也比较深入了。从 new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的,也许不是这段代码,而是当时那种学习 的心境,硬着头皮看 (尽管当时很多看不懂),而现在已经很久没有那种心境了,这次写下这 篇博客留恋。 随机日志  Android 2.0 SDK发布了  Android画图学习总结(三)——Drawable  [翻译]点基础知识——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)  Android画图学习总结(一)——类的简介  MOTOBLUR模拟演示视频[Video] Java I/O总结——InputStream 在前面介绍了Decorator(装饰)模式, 让我自己想起了刚开始工作时那段“痛并快乐”的学习 时光。在学习Android网络方面,也发现网络方面的很多内容都与Java I/O有关,因此暂时先停 下Android网络方面的学习,把Java I/O完整的学习下。我们将按照基类的顺序:InputStream、 OutPutStream、Reader、Writer来分别对Java I/O加以总结。 在这里强调以下 2 点:  如果你对设计模式中的Decorator(装饰)不是很了解,请仔细阅读:从new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的,在这篇博客中,我们详细介绍了Decortor (装饰)模式。在了解了Decorator(装饰)后,我们对学习Java I/O的学习会容易很多,因为Java I/O的核心就是采用了Decorator(装饰)模式。  Java I/O 系列的博客是我在学习 Java I/O 的基础上,对 Java I/O 的总结,关于 Java I/O 方面的 基础知识,我们在这里不详细说明。如果你对 Java I/O 完全不了解,请先找些关于 Java I/O 方面 www.moandroid.com 的资料简要阅读下。在简要学习的基础上,我们将 Java I/O 方面的资料整理,帮助大家对 Java I/O 的知识更加清晰些。 Java I/O相关的包,如下表格所示: 在这里,我们主要介绍 java.io 包。 流的分类,如下图所示: 过滤流就是采用了 Decorator(装饰)模式,后面我们会为大家详细说明。 Java I/O的设计原则(Decorator(装饰)模式) mo-Android 感受 Android 带给我们的新体验 www.moandroid.com java.io.InputStream类总结 首先学习基类 java.io.InputStream(读取一系列字节的对象),以及在它基础上派生出来的子 类,类结构图如下图所示(单击查看大图片): mo-Android 感受 Android 带给我们的新体验 www.moandroid.com mo-Android 感受 Android 带给我们的新体验 www.moandroid.com InputStream 是一个抽象类,是所有数据形式为字节的输入流的父类,为基于字节的数据输入定 义了基本操作方法。实际 上,InputStream 的子类大部分都没有增加任何其他的接口函数(在 上面的类结构图中就可以发现),因此在看 InputStream 子类的时候,我 们主要学习其构造函 数。 Java I/O 中是如何采用 Decorator(装饰)模式的呢?下面为大家详细说明,看到 FilterInputStream 类(也就前面说的过滤流,后面你会 发现更多的过滤流),你是否发现了? 对,就是 FilterInputStream 类,她就相当于 Decorator(装饰)模式中的 Decorator 类,而且 的 BufferedInputStream、DataInputStream、PushbackInputStream 则相当于是 ConcreateDecorator,如下图所示: 那么 Java I/O中到底是如何使用的了?Decorator(装饰)模式的主要意图是:动态地给一个对 象添加一些额外的职责,这句话很抽象,我们结合 Java I/O 举个具体的例子:比如说我们读取 文件,首先打开文件获取到 File,然后我们再创建一个 FileInputStream,然后读取文件。读取 文件是 一个很费时的操作,尤其是需要多次的读写文件。 自己的一点经历与大家分享:在一次 C++编程的时候,需要打开文件然后每次读取一小段数据, 后来发现整个程序的效率比较低,通过测试代码发现,对数 据的读取方面占用太多的时间。尽 管 C++对文件的读取中实现了缓冲机制,但是好像这个缓冲区域比较小,然后通过_setbuf()函 数增大缓冲区,发现程 序的数度居然提升了很多。 mo-Android 感受 Android 带给我们的新体验 www.moandroid.com 那么在 Java 中采用面向对象的思想:BufferedInputStream 实现了对数据读取的缓冲机制,通 过 FileInputStream 来 读取数据,BufferedInputStream 将已经读取的数据存储到缓冲区, BufferedInputStream 相当于对 FileInputStream 进行了“装饰”。 File file = new File(“c:\\moandroid.txt”,true); InputStream is = new BufferedInputStream(new FileInputStream(file)); long length = file.length(); if(length>Integer.MAX_VALUE) { System.out.println(“source file is too large”); return ; } byte[] bytes = new byte[(int)length]; int offset = 0,numRead = 0; while( offset= 0) offset += numRead; if(offset
还剩26页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

damon1412

贡献于2012-05-03

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf