学习目标

  • 字符流
    • 字符流读写数据
  • 字符缓冲流
    • 字符缓冲流读写数据
  • 转换流
    • 字节流转换成字符流
  • 序列化流
    • 序列化与反序列化数据
  • 装饰设计模式
    • 装饰设计模式思想
    • 装饰设计模式代码
  • commons-io工具包

    • 第三方工具的使用步骤
    • commons-io常用API

      1. 字符流

      1.1 常见的编码表及特点 ?

  • ASCII (美国信息交换标准码表) 包括了数字字符,英文大小写字符和一些常见的标点符号字符。(没有中文)

  • GBK window系统默认的码表。兼容ASCII码表,也包含了21003个汉字,并支持繁体汉字以及部分日韩文字(GBK是中国的码表,一个中文以两个字节的形式存储。但不包含世界上所有国家的文字)
  • Unicode码表 由国际组织ISO 制定,是统一的万国码表,计算机科学领域里的一项业界标准,容纳世界上大多数国家的所有常见文字和符号( Unicode是万国码表,以UTF-8编码后一个中文以三个字节的形式存储)

1.2 字符流的组成 及字符流能解决什么问题 ?

  • 组成:字符流 = 字节流 + 编码表

  • 字符流的作用:字符流能够解决字节流在把文本文件中的内容读取到内存中时,以及把中文写入到文本文件中时,可能会出现乱码的问题。

  • 字节流为什么读中文会出现乱码?因为字节流一次读一个字节,而不管GBK还是UTF-8一个中文都是多个字节,用字节流每次只能读其中的一部分,所以就会出现乱码问题

    1.3 字符缓冲流如何使用 ?

    1. //需求:读取文件中的数据 : 33 22 11 55 44
    2. //排序后 : 11 22 33 44 55 再次写到本地文件
    3. public class BufferedStreamDemo3 {
    4. public static void main(String[] args) throws IOException {
    5. //1. 创建高效的字符输入流
    6. BufferedReader br = new BufferedReader(new FileReader("day11_demo\\aa.txt"));
    7. //2 读取文件中的一行数据
    8. //3 将数据按照空格切割
    9. String[] strings = br.readLine().split(" ");
    10. //4 把字符串数组转成int类型数组
    11. int[] arr = new int[strings.length];
    12. for (int i = 0; i < strings.length; i++) {
    13. arr[i]=Integer.parseInt(strings[i]);
    14. }
    15. //5 对int类型的数组进行排序
    16. Arrays.sort(arr);
    17. //6 创建高效的字符输出流对象
    18. BufferedWriter bw = new BufferedWriter(new FileWriter("day11_demo\\bb.txt"));
    19. //7 遍历数组,把数组中的数据写入到文件中
    20. for (int i = 0; i < arr.length; i++) {
    21. bw.write(arr[i]+" ");
    22. bw.flush();
    23. }
    24. //8 释放资源
    25. br.close();
    26. bw.close();
    27. }
    28. }


    1.4 转换流能解决什么问题 ?

  • 转换流就是来进行字节流和字符流之间转换的桥梁

image.png

1.5 转换流如何使用 ?

  1. public class ConversionDemo1 {
  2. public static void main(String[] args) throws IOException {
  3. //创建转换输出流
  4. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("Day11_demo\\aa.txt"), "GBK");
  5. //写数据
  6. osw.write("远桥之下泛莲舟");
  7. osw.write("\r\n");
  8. osw.write("岱岩石上松溪流");
  9. osw.write("\r\n");
  10. osw.write("万仞翠山梨亭在");
  11. osw.write("\r\n");
  12. osw.write("莫闻空谷声悠悠");
  13. //释放数据
  14. osw.close();
  15. //创建转换输入流
  16. InputStreamReader isr = new InputStreamReader(new FileInputStream("Day11_demo\\aa.txt"), "GBK");
  17. //写数据
  18. int s;
  19. while ((s=isr.read())!=-1){
  20. System.out.print((char) s);
  21. }
  22. //释放资源
  23. isr.close();
  24. }
  25. }

2.设计模式

2.1 装饰者模式能解决什么问题

  • 装饰模式指的是在不改变原类, 不使用继承的基础上,动态地扩展一个对象的功能。
  • 不使用继承技术扩展功能, 可以降低耦合

    2.2 装饰者模式使用原则 ?

  1. 装饰类和被装饰类需要有共同的父类型。
  • 在之前学习过的 BufferedWriter 和 FileWriter 就是装饰设计模式
  • BufferedWriter的父类为Writer
  • FileWriter的父类也是Writer
  • 我们把FileWriter的对象传递到BufferedWriter的构造中 , 那么可以理解为BufferedWriter是装饰类 , FileWriter是被装饰类
  • BufferedWriter对FileWriter的功能做了增强
  1. 装饰类的构造要接收被装饰类的对象
  • FileWriter fw = new FileWriter(“路径”);
  • BufferedWriter bw = new BufferedWriter(fw);
  1. 在装饰类中把要增强扩展的功能进行扩展
  • BufferedWriter和FileWriter的功能一样, 都具备Writer中写数据的功能
  • 但是BufferedWriter提供了缓冲区 , 相当于对FileWriter功能做了扩展
  1. 对于不要增强的功能直接调用
  • 不需要增强的功能直接继承父类的即可