java io框架,java设计框架

  java io框架,java设计框架

  对于程序设计语言设计者来说,设计一个满意的I/O(输入输出)系统是一项极其艰巨的任务—— 《Thinking in Java》。

  Java程序通过流完成输入/输出,流是生产或消费信息的抽象。通过Java的输入/输出系统,流被连接到物理设备。尽管它们与所连接的物理设备不同,但所有流的行为方式都是一样的。这样,相同的输入/输出类和方法适用于所有类型的外部设备,这意味着输入流可以被抽象成许多不同类型的输入:来自磁盘文件、来自键盘或来自网络套接字。类似地,输入流可以输出到控制台、磁盘文件或连接的网络。流是处理输入/输出的一种干净的方式。比如它不需要代码就能理解键盘和网络的区别。Java stream的实现在java.io包定义的类层次结构内。

  # #输入/输出流概念

  在输入/输出期间,数据在通信信道中流动。所谓“流”是指所有数据通信通道中数据的开始和结束,信息的通道就是数据流。只要数据从一个地方“流到”另一个地方,这个数据流的通道就可以成为数据流。

  I/O是相对于程序而言的,程序在使用数据时扮演两个角色:一个是源,一个是目的。如果程序是数据流的来源,也就是数据的提供者,那么这个数据流就是程序的一个“输出数据流”(数据从程序中流出);如果程序是数据的终点,那么这个数据流就是程序的“输入数据流”(数据从程序外部流向程序)。

  输入/输出类可以分为两类:输入流和输出流。

  结构上可分为字节流(基于字节或面向字节)和字符流(基于字符或面向字符)。

  字节的输入和输出流基于两个抽象类,InputStream和OutputStream。字节流的输入输出操作是通过这两个类的子类来实现的。Java1.1版之后新增了字符流,字符流的输入输出所基于的抽象类是Reader和Writer。

  字节流和字符流Java2定义了两种类型的流:字节流和字符流。字节流提供了一种处理字节输入和输出的便捷方式。例如使用字节流读取或写入二进制数据。字符流为字符的输入和输出处理提供了方便。他们采用统一的编码标准,所以可以国际化。当然,在某些情况下,字符流比字节流更有效。

  Java的原始版本(Java1.0)没有包含字符流,所以这个版本中所有的输入输出都是以字节为单位的,Java1.1中加入了字符流。

  声明:在最底层,所有的输入/输出都是字节形式,基于字符的流只是为了提供一种方便有效的处理字符的方式。

  流的分类两种基本的流是:输入流和输出流。可以从中读取一系列字节的对象称为输入流,而可以向其中写入一系列字节的对象称为输出流。

  Node:从特定位置(如磁盘或内存区域)读写的流类。

  过滤:使用节点流作为输入或输出。使用现有的输入流或输出流连接创建过滤器流。

  InputStreamInputStream包含字节输入流所需的一整套方法。它可以完成从InputStream读取数据的最基本功能。当Java程序需要外设数据时,可以根据数据的不同形式创建一个合适的InputStream子类对象来完成与外设的连接,然后调用并执行这个Stream类对象的特定输入方法来实现相应外设的输入操作。

  当然,InStream类的子类继承了InStream类的方法。常用的方法有:read()读取数据,available()获取InputStream的字节,skip(),reset(),mark()定位输入位置指针等。

  OutputStream三种基本的书写方法:

  抽象void write(int b):向输出流写入一个字节。Void write(byte[] b):将数组b中的所有字节写入输出流。Voidwrite (byte [] b,int off,int len):将数组b中offset off位置的len字节数据写入输出流。

  其他方法:void flush():刷新输出流,强制写出缓冲区中的输出字节。Void close():关闭输出流,释放与该流相关的系统资源。OutputStream是一个抽象类,定义了流字节输出模式。该类的所有方法都返回一个void值,并在出现错误时引发IOException异常。

  过滤器流在InputStream类和OutputStream类的子类中,FilterInputStream和FilterOutputStream过滤器流的抽象类派生DataInputStream和DataOutputStream数据iostream类的子类。

  Java I/O库的设计原理Java I/O库提供了一种叫做链接的机制,可以将一个流连接到另一端,形成流管道的链接。这个机制实际上是一个叫做装饰设计模式的应用。

  通过流的链接,可以动态增加流的功能,这种功能的增加是通过组合一些流的基本功能动态获得的。

  当我们要获取一个I/O对象时,往往需要生成多个I/O对象,这也是JavaI/O库不容易掌握的原因。然而,装饰器设计模式在I/O库中的应用为我们提供了实现上的灵活性。

  Decorator Decorator,也称为Wrapper,以对客户端透明的方式扩展对象的功能,这是继承的一种替代方式。装饰模式以对客户透明的方式动态地将更多的责任附加到一个对象上。也就是说,客户并没有感觉到装修前后的对象有什么不同。装饰模式可以在不创建更多子类的情况下扩展对象的功能。装饰设计模式将客户端的调用委托给被装饰的类,装饰设计模式的关键是这个扩展是完全透明的。设计模式是在不改变原类文件和使用继承的情况下,动态扩展一个对象的功能。就是通过创建一个包装对象来包装实物,也就是装饰。装饰模式的角色:抽象组件角色:给出一个抽象接口来标准化准备接受额外责任的对象。具体组件:定义一个将接收额外职责的类。Decorator:保存对组件对象的引用,并定义与抽象组件接口一致的接口。具体装饰者:负责在组件对象上“粘贴”额外的责任。装饰者模式的特点:装饰对象和真实对象具有相同的接口,这样客户端对象就可以像真实对象一样与装饰对象进行交互。装饰对象包含对真实对象的引用。装饰对象接收来自客户端的所有请求:它将这些请求转发给真实对象。修饰对象可以在转发这些请求之前或之后添加一些额外的函数,从而确保可以在运行时从外部添加额外的函数,而无需修改给定对象的结构。在面向对象设计中,通常通过继承来实现给定类的功能扩展。实现代码装饰设计模式:1。首先,创建一个接口组件,相当于抽象的组件角色。

  公共接口组件{ void do something();}2.创建一个ConcreteComponent类来实现组件接口,相当于具体的组件角色。

  类具体组件实现component { @ override public void do something(){ system . out . println( function a );}}3.创建Decorator类并实现组件接口,这相当于装饰角色。这个类是装饰图案的核心。

  装饰角色必须满足两个要求:

  a、装饰角色必须实现抽象组件角色B、装饰角色必须持有抽象组件角色的引用。

  公共类装饰器实现组件{私有组件Component;public Decorator(Component组件){ this.component=component} @ override public void do something(){ component . do something();}}4.当创建两个具体的装饰角色ConcreteDecorator1和ConcreteDecorator2时,这两个角色都继承了Decorator。

  公共类ConcreteDecorator1扩展了Decorator { public concrete Decorator 1(Component Component){ super(Component);} @覆盖public void do something(){ super . do something();doAnotherThing();} private void doanotherthing(){ system . out . println(函数b );} }公共类ConcreteDecorator2扩展Decorator { public concrete Decorator 2(Component Component){ super(Component);} @覆盖public void do something(){ super . do something();doAnotherThing();} private void doanotherthing(){ system . out . println(函数C );}}5.创建一个客户端客户端使用装饰设计模式。

  public class Client { public static void main(String[]args){ Component Component=new concrete decorator 2(new concrete decorator 1(new concrete Component()));component . do something();}}装饰模式与继承装饰模式:

  它用于扩展特定对象的功能,而不需要子类。责任的动态运行时分配防止了子类引起的复杂性和混乱。更加灵活。对于一个给定的对象,可能同时存在不同的装饰对象。客户可以根据自己的需要选择合适的装饰物品进行操作。继承:

  当子类被静态编译时,扩展一类对象的功能需要分配责任,这导致了臃肿和不灵活的子类系统。Decorator的适用性希望在不影响其他对象的情况下,透明地、动态地向对象添加新的职责(方法)。

  添加到对象的责任将来可能会改变。

  当用子类扩展函数不切实际时

  版权归作者所有:原创作品来自博主肖波,转载请联系作者取得授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: