java万法_Java I/O库的设计分析

Java采用了流的机制来实现输入/输出。所谓流,就是数据的有序排列。

而流可以是从某个源(称为流源或Source of Stream)出来,到某个目的地(称为流汇或Sink of Stream)去的。

由流的方向,可以分成输入流和输出流。一个程序从输入流读取数据向输出流写数据。

流处理器所处理的流必定都有流源,而如果将流类所处理的流源分类的话,基本可以分成两大类:

第一 数组,String,File等,这一种叫原始流源。

第二 同样类型的流用做链接流类的流源,叫链接流源。

Java语言的I/O库是对各种常见的流源,流汇以及处理过程的抽象化。

客户端的Java程序不必知道最终的流源,流汇是磁盘上的文件还是数组等;(原始流)

也不必关心数据是否经过缓冲的,可否按照行号读取等处理的细节。(链接流)

要理解Java I/O这个庞大而复杂的库,关键是要掌握两个对称性跟两个设计模式。

Java I/O库具有两个对称性,它们分别是:

1 输入-输出对称性:

比如InputStream和OutputStream各自占据Byte流的输入与输出的两个平行的等级结构的根部。

而Reader和Writer各自占据Char流的输入与输出的两个平行的等级结构的根部。

2 byte-char对称:

InputStream和Reader的子类分别负责Byte和Char流的输入;

OutputStream和Writer的子类分别负责Byte和Char流的输出,

它们分别形成平行的等级结构。

Java I/O库的两个设计模式:

装饰者模式(Decorator)

适配器模式(Adapter)

1 装饰者模式:

在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的,具有改善了的功能的流处理器。

【装饰者模式是Java I/O库的整体设计模式】

2 适配器模式:

在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器是对其它类型的流源的适配。

【适配器模式应用到了原始流处理器的设计上面,构成了I/O库所有流处理器的起点。】

装饰者模式的具体应用:

Java I/O库是由一些基本的原始流处理器和围绕它们的装饰流处理器所组成的。

InputStream类型中的装饰模式:

InputStream有七个直接的具体子类,和四个属于FilterInputStream的具体子类。

根据输入流的源的类型,可以将这些流类分成两种,

即原始流类(Original Stream)和链接流处理器(Wrapper Stream)。

原始流处理器:

接收一个Byte数组对象,String对象,FileDiscriptor对象或者不同类型的流源对象。

包括以下四种:

1)ByteArrayInputStream

2)FileInputStream

3)PipedInputStream

4)StringBufferInputStream

链接流处理器:

就是可以接收另一个流对象作为源,并对之进行功能扩展的类。

包括以下几种:

1)FilterInputStream,四个子类如下:

1.1)BufferedInputStream

1.2)DataInputStream

1.3)LineNumberInputStream

1.4)PushbackInputStream

2)ObjectInputStream

3)SeqcueneInputStream

装饰模式的使用目的:

链接流对象接收一个原始流对象或者另外一个链接流对象作为流源;

另一方面他们对流源的内部工作方法做了相应的改变。

适配器模式的具体应用:

FileInputStream是一个适配器类:

它继承了InputStrem类型,同时持有一个对FileDiscriptor的引用。

这是将一个FileDiscriptor对象适配成InputStrem类型的对象形式的适配器模式。

StringBufferInputStream是一个适配器类:

它继承了InputStream类型,同时持有一个对String对象的引用。

这是一个将String对象适配成InputStream类型的对象形式的适配器模式。

ByteArrayOutputStream是一个适配器类:

它继承了OutputStream类型,同时持有一个对byte数组的引用。

这是一个将byte数组的接口适配成OutputStream类型的接口的适配器模式。

FileOutputStream是一个适配器类:

它继承了OutputStream类型,同时持有一个对FileDiscriptor对象的引用。

这是一个将FileDiscriptor接口适配成OutputStream接口的适配器模式。

StringReader是一个适配器类:

它类继承了Reader类型,持有一个对String对象的引用。

这是一个将String的接口适配成Reader类型的接口的适配器模式。

InputStreamReader是一个适配器类:

它继承了Reader类型,同时持有一个对InputStream对象的引用。

InputStreamReader是从byte输入流到char输入流的一个适配器

OutputStreamWriter是适配器类:

。。。

OutputStringWriter是从OutputStream到Writer的适配器类

与任何一个OutputStream的具体子类相链接时,OutputStringWriter可以将OutputStream类型的byte流适配成为char流。

其他参考内容:

原始流处理器

1. ByteArrayInputStream:为多线程的通信提供缓冲区操作功能,接收一个Byte数组作为流的源。

2. FileInputStream:建立一个与文件有关的输入流。接收一个File对象作为流的源。

3. PipedInputStream:可以与PipedOutputStream配合使用,用于读入一个数据管道的数据,接收一个PipedOutputStream作为源。

4. StringBufferInputStream:将一个字符串缓冲区转换为一个输入流。接收一个String对象作为流的源。

(JDK帮助文档上说明:已过时。此类未能正确地将字符转换为字节。从JDK1.1开始,从字符串创建流的首选方法是通过StringReader类进行创建。只有字符串中每个字符的低八位可以由此类使用。)

链接流处理器:

1. FilterInputStream称为过滤输入流,它将另一个输入流作为流源。这个类的子类包括以下几种:

BufferedInputStream:用来从硬盘将数据读入到一个内存缓冲区中,并从缓冲区提供数据。

DataInputStream:提供基于多字节的读取方法,可以读取原始类型的数据。

LineNumberInputStream:提供带有行计数功能的过滤输入流。

PushbackInputStream:提供特殊的功能,可以将已经读取的字节“推回”到输入流中。

2. ObjectInputStream可以将使用ObjectInputStream串行化的原始数据类型和对象重新并行化。

3. SeqcueneInputStream可以将两个已有的输入流连接起来,形成一个输入流,从而将多个输入流排列构成一个输入流序列。

Java语言的I/O库提供InputStream,OutputStream,Reader,Writer四个系列的类。

InputStream和OutputStream处理8位字节流数据;Reader和Writer处理16位的字符流数据。

InputStream和Reader处理输入,OutputStream和Writer处理输出。

Java语言支持四种类型:Java接口,Java类,Java数组,原始类型(即int,float等)。

前三种是引用类型,类和数组的实例是对象,原始类型的值不是对象。

也即,Java语言的数组是像所有的其他对象一样的对象,而不管数组中所存储的元素类型是什么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四节:IO、序列化和反序列化、加密解密技术

一. IO读写   这里主要包括文件的读、写、移动、复制、删除、文件夹的创建、文件夹的删除等常规操作。 注意:这里需要特别注意,对于普通的控制台程序和Web程序,将"相对路径"转换成"绝对路径"的方法不一致。 (1). 在w…

java mediator_java—mediator中介模式

中介者模式是由GoF提出的23种软件设计模式的一种。Mediator模式是行为模式之一,Mediator模式定义:用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。适用性…

第五节:泛型(泛型类、接口、方法、委托、泛型约束、泛型缓存、逆变和协变)

一. 泛型诞生的背景 在介绍背景之前,先来看一个案例,要求:分别输出实体model1、model2、model3的id和name值,这三个实体有相同的属性名字id和name。 1 public class myUtils2 {3 //要求:分别输出实体model1、model2、…

第六节:反射(几种写法、好处和弊端、利用反射实现IOC)

一. 加载dll,读取相关信息 1. 加载程序集的三种方式 调用Assembly类下的三个方法:Load、LoadFile、LoadFrom。 1       //1.1 Load方法:动态默认加载当前路径下的(bin)下的dll文件,不需要后缀 2 Assembly assembly Assembly.Load(&…

第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)

一. 语法糖简介 语法糖也译为糖衣语法,是由英国计算机科学家彼得约翰兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说…

java不用插件播放媒体文件_java servlet不用插件上传文件:

展开全部import java.net.*;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class SaveFileServlet extends HttpServlet{FileWriter savefile;String filename null;String value null;/*** Handles a POST request*/publ…

第八节:语法总结(2)(匿名类、匿名方法、扩展方法)

一. 匿名类 1. 传统的方式给类赋值,需要先建一个实体类→实例化→赋值,步骤很繁琐,在.Net 3.0时代,微软引入匿名类的概念,简化了代码编写,提高了开发效率。 匿名类的声明语法: var objnew {字段…

java 里面matches什么意思_Java Regex中的matches()和find()之间的区别

如果完整string匹配, matches()将只返回true。 find()会尝试find匹配正则expression式的子string中的下一个匹配项。 注意强调“下一个”。 这意味着,多次调用find()的结果可能不一样。 另外,通过使用find()你可以调用start()来返回子string匹…

第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

一. 委托的发展历史和基本用法 说起委托,每个人可能都会对他有不同的理解,结合实战中委托的使用,我对其理解是:委托和类一样,是用户的一个自定义类型,委托可以有参数、有返回值,委托的关键字是d…

java为什么不使用odbc_java jdbc和odbc的区别是什么?jdbc和odbc的关系是怎样的?

对于jdbc和odbc你都了解多少呢?今天要给大家讲到的就是jdbc和odbc之间的内容,一起来了解一下jdbc和odbc的区别以及关系是怎样的吧!下面先来给大家介绍一下jdbc和odbc之间的区别。总的来说,jdbc和odbc的区别可以划分成三大部分,一起来看看。一…

第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托。 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下。 1 public class Calculator22 {3 //传统解决方案一&am…

java中sql之count_按SQL Server中的count()子句分组

我正在尝试编写一个SQL查询,它将返回聚合值列表;但是,我想通过其中一个聚合值(计数)对查询进行分组:select t.Field1, count(distinct(t.Field2), SUM(t.Value1)from MyTable tgroup by t.Field1, count(t.Field2)我已经尝试将计数放入子查询…

java+sm4+加密算法_SM4加密算法实现Java和C#相互加密解密

https://www.cnblogs.com/miaoziblog/p/9040473.html近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多数据类型与C#的相同的数据类型是存在不同的比…

用java设计节拍器_具有高速的Java节拍器

关于Thread.sleep()不可靠的答案是正确的:你不能指望它完全返回你指定的时间.事实上,我很惊讶你的节拍器可以使用,特别是当你的系统负载不足时.阅读Thread.sleep()的文档以获取更多详细信息.关于MIDI的Max Beikirch的答案是一个很好的建议:MIDI处理时机非…

java隐藏密钥_java – 在Android中隐藏密钥库密码的最佳方法是什么?

我是Android开发和实现SSLSockets的新手.在做了一些挖掘后,我能够设置一个正常工作的简单服务器/客户端.我认为实现可以使用一些工作,并且难以将密码加载到密钥库而不用纯文本.这是客户端的一些代码.如您所见,我将密码硬编码到本地var中.是否有更好的方法加载密钥库密码,所以我…

DotNet进阶系列

一. 回顾历史 回顾个人发展历程,自2012年初次接触开发至今(2018年)已经有六个年头,这期间陆陆续续学习并掌握了不少技术,C#语言、ORM框架、多线程技术、设计模式、前端技术、MVC、MVVM框架思想等等,每种技术随着多次使用&#xff…

美团科技 Java工程师_美团Java工程师面试题(2018秋招)

第一次面试1.小数是怎么存的2.算法题:N二进制有多少个13.Linux命令(不熟悉4.JVM垃圾回收算法5.C或者伪代码实现复制算法6.volatile7.树的先序中序后序以及应用场景8.Mysql存储记录的数据结构9.索引数据结构10.为什么不用AVL和红黑树存?11.说实习项目12.r…

第十一节:特性(常见的特性标签、自定义特性、特性的使用案例)

一. 基本概念 1. 什么是特性? MSDN官方给出的定义时:公共语言运行时允许添加类似关键字的描述声明,叫做特性,它对程序中的元素进行标注,如类型、字段、方法和属性等。Attribute和Microsoft .Net Framework文件的元数据&#xff…

java不建议用全局变量吗_不要使用全局变量, ThreadLocal也不行

不要使用全局变量的道理大家都懂,基本上在大家学习编程过程中很早就会被教育到,但是有时候我们也会禁不住诱惑用到一些似非实是的全局变量,只不过这些全局变量会穿上马甲,让你不会一下看穿它的巨大危害,这里就讲一下我…

第十二节:Lambda、linq、SQL的相爱相杀(1)

一. 谈情怀 Lambda、Linq、SQL伴随着我的开发一年又一年,但它们三者并没有此消彼长,各自占有这一定的比重,起着不可替代的作用。 相信我们最先接触的应该就是SQL了,凡是科班出身的人,大学期间都会学习SQL Server数据库…