前言. IO中常见的使用方式

DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(file))));

提问:嵌套的原理是什么?
答:写入文件时,使用了装饰者模式
从里往外分析:
new File(file) --> 将文件路径转换为真正的系统文件
new FileOutputStream(File) --> 将文件修饰成数据流(磁盘访问)
new BufferedOutputStream(FileOutputStream)–> 对数据流进行包装,在内存中开辟一个buffer,每次向磁盘写文件,读满buffer缓冲区,读完了重新发起对磁盘的读取。
new DataOutputStream(BufferedOutputStream) --> 为了体现buffer的类型,由DataOutputStream对buffer进行包装

1. 装饰者模式之Android中的应用

注意: 关键点!!!
Decorator类中一定要包含Component接口,这样才能各种装饰器调用的时候有一个功能的Component对象可以赋值,实现真正的修饰。

public abstract class Person{public String name;public Person(){}public Person(String name){this.name = name;}public abstract void show();
}
public class SinglePerson extends Person{public SinglePerson(String name){super(name);}@Overridepublic void show(){System.out.println("我是一个孤独的人");}
}
public class Decorator extends Person{Person person;public Decorator(Person person){this.person = person;}@Overridepublic void show(){person.show();}
}
public class RShoes extends Decorator{public RShoes(Person person){super(person);}@Overridepublic void show(){super.show();System.out.println("穿RShoes");}
}
public class TShirt extends Decorator{public TShirt(Person person){super(person);}@Overridepublic void show(){super.show();System.out.println("穿TShirt");}
}

测试

public class TestMain{public static void main(String[] args){SinglePerson singlePerson = new SinglePerson("Andy");RShoes rShoes = new RShoes(singlePerson);TShirt tShirt = new TShirt(rShoes);tShirt.show();//TShirt tShirt2 = new TShirt(new RShores(new SinglePerson("Bob")))}
}

2. 装饰者模式之IO中的应用

  1. 流式部分——最主要的部分。如:OutputStream、InputStream、Writer、Reader等
  2. 非流式部分——如:File类、RandomAccessFile类和FileDescriptor等类
  3. 其他——文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。

2.1 流式部分

字节流

FilterOutputSteam相当于上面例子中的Decorator类

字符流

OutputStreamWrite是字节与字符连接的桥梁

字符字节的区别:字符有一个Readline(),有“行”的概念
例:zip bitmap exe 用字节流
json xml用字符流

2.2 非流式部分

File
RandomAccessFile

多线程中分段下载
构造方法:
RandomAccessFile raf = new RandomAccessFile(File file, String mode);
其中参数mode的值可选“r”:可读,“w”:可写,“rw”:可读写
成员方法:
seek(int index);可以将指针移动到某个位置开始读写
setLength(long length);给写入文件预留空间

//每个汉字占3个字节,写入字符串的时候会有一个记录写入字符串长度的两个字节
rsf.writeUTF("一二三四"); //所以是3*4+2 = 14个字节长度

特点和优势:

  1. 既可以读也可以写
    RandomAccessFile不属于InputStream和OutputStream类系的它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是自己从头开始规定的,这里面包含读写两个操作
  2. 可以指定位置读写
    RandomAccessFile能在文件里面前后移动,在文件里移动用seek(),所以他的行为与其他的IO类有些根本性的不同。总而言之,它是一个直接继承Object的独立的类。只有RandomAccessFile才有seek搜索方法,而这个方法也只适用于文件

Java IO 体系(一): 装饰者模式相关推荐

  1. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  2. java+io体系结构图_Java IO 体系结构

    Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是 ...

  3. java中什么是装饰者模式? 装饰者模式的使用!!

    其实无论是代理模式还是装饰模式.本质上我认为就是对原有对象增强的方式~ 一.对象增强的常用方式 很多时候我们可能对Java提供给我们的对象不满意,不能满足我们的功能.此时我们就想对Java原对象进行增 ...

  4. java I/O之装饰者模式

    装饰者: Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式意图: 动态的给一个对象添加额外的职责.Decorato ...

  5. JAVA设计模式初探之——装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorat ...

  6. Java常用设计模式之装饰者模式

    在我们进行Java开发的时候,很多时候我们可能对Java提供给我们的对象不满意,不能满足我们的功能.此时我们就想对Java原对象进行增强,能够实现我们想要的功能就好. 一般来说,实现对象增强有三种方式 ...

  7. JAVA设计模式初探之装饰者模式

    这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活. 设计初衷:通常可以 ...

  8. 通俗易通,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了

    文章目录 什么是装饰者模式 装饰者模式中的角色 抽象构件(Component)角色 具体构件(Concrete Component)角色 装饰(Decorator)角色 具体装饰(Concrete D ...

  9. Java IO 体系(三):Reader与Writer

    正文 本篇讲述的是Java IO中的Reader类和Writer类.跟之前讲述的InputStream和OutputStream一样为IO流中的抽象父类之一,不过Reader和Writer的操作对象不 ...

最新文章

  1. 初次安装Magento商城 后台报错的解决方案
  2. 获取3的倍数_获取和设置pdf目录
  3. 华为鸿蒙系统智能手机_余承东再度确认:鸿蒙系统将适配到华为手机上
  4. 苹果cms后台微信小程序影视源码-带视频教程
  5. 设置屏幕横屏_android设置横屏和竖屏的两种方法
  6. 上海科技大学计算机研究生调剂,2021年上海科技大学考研招生调剂信息
  7. 单链表的实现 (C语言版 数据结构 严蔚敏)
  8. 空间换时间,轻松提高性能100倍
  9. ios-swift-环信集成
  10. Springer-Verlag免费下载图书400本
  11. 中国式“高定美学”燃爆广州秀场!「琢我」之气场与「莲玉芳华」之优雅
  12. 走近棒球运动·全国青年棒球锦标赛·MLB棒球创造营
  13. Android下载图片并添加图片水印
  14. html怎么设置视频不能快进,【浏览器插件】Video Speed Controller – 网页视频倍速、快进、回放功能0.07~16 倍...
  15. 图像质量评价和人脸素描合成
  16. 如果同步块内的线程抛出异常会发生什么?
  17. CentOS7安装MySQL
  18. 微信小程序父组件调用子组件方法
  19. iOS--触碰响应UIResponder UIGestureRecognizer
  20. 2023 华为 Datacom-HCIE 真题题库 04/12--含解析

热门文章

  1. linux c语言 int 数组初始化,c/c++ int数组初始化/重置为0
  2. matlab定积分上界求解,定积分问题的数值求解及Matlab实现.pdf
  3. cnocr训练_cnocr: 极简的中文OCR Python包
  4. java nifty_Java NiftyDialogBuilder類代碼示例
  5. 以太网未启用DHCP解决方法
  6. python进程socket通信_Python Socket TCP双端聊天功能实现过程详解
  7. 监督分类空白处也被分类了_用于半监督短文本分类的异构图注意网络
  8. 以太坊白皮书_区块链60讲第33集~什么是以太坊?
  9. Google I/O 大会上的 Android Things 亮点汇总
  10. 直播APP开发:直播的广告效益和号召力分析