前言. 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. LaZagne检测windows本地存储的密码
  2. Delphi_01_控制台版HelloWorld
  3. Linux上Core Dump文件的形成和分析
  4. Linux内核——进程管理与调度
  5. 函数的相关操作——利用函数翻转任意数组||利用函数冒泡排序||利用函数判断闰年
  6. 我们为什么要学Java?Java好在哪?
  7. 虚拟机安装Solaris10
  8. ubuntu16.04+xfce4截图、终端调出、锁屏的快捷键设置、去掉Alt+鼠标移动屏幕的功能、安装thunar、小键盘问题、设置终端背景
  9. Angular 应用的Support package
  10. 利用老毛头启动盘重装win7
  11. tornado学习笔记day03-响应输出
  12. css 背景图片的虚化
  13. java获取两张图片的相似度
  14. 自从安上了“AI”,这些商务经理天天按时下班了
  15. spring boot + nacos多环境部署
  16. The Semantics of Constructors(拷贝构造函数之编译背后的行为)
  17. HTML5七夕情人节表白网页制作【圣诞节3d相册】HTML+CSS+JavaScript 圣诞节3D相册代码表白制作
  18. 经济应用文写作【5】
  19. java 最大整形_Java大整形BigInteger的用法
  20. 腾讯云服务器迁移报错Other go2tencentcloud are running.

热门文章

  1. mysql+翻页性能,mysql 翻页优化
  2. hive查询where join_Hive系列(4):常用函数where,join
  3. 远程计算机管理权限,肿么获得远程计算机管理员权限
  4. mysql 连接 优化_(一)MySQL 连接优化
  5. python制作二级菜单_python实现二级登陆菜单及安装过程
  6. MFC/UDP通信函数详细解说
  7. 在Windows下使用make命令
  8. conda create -n python 3.6_conda创建python环境
  9. c++排查线程hang住_Kafka学习笔记之kafka高版本Client连接0.9Server引发的血案排查 - 时光飞逝,逝者如斯...
  10. bazel 链接第三方动态库_Linux 动态库与静态库制作及使用详解