今日学习目标

  • 编码表
  • 字符输出流
  • 字符输入流
  • 字符缓冲流
  • 转换流
  • 对象操作流
  • 装饰模式
  • commons-iojar包

    1 编码表

    | 表名 | 关系 | 作用 | | —- | —- | —- | |
    ASCII码
    | 其他码表包含ascll表 | 没有中文 | |
    GBK码
    | GBKwindows默认码表 | 中文占两个字节 | |
    Unicode码
    | Unicode世界通用码表 | 中文占三个字节 |

2 字符输出流

FileWriter的成员

  • 构造方法 :
    • public FileWriter(File file) : 往指定的File路径中写入数据
    • public FileWriter(String fileName) : 往指定的String路径中写入数据
  • 成员方法: | void write(int c) | 写一个字符 | | —- | —- | | void write(char[] cbuf) | 写入一个字符数组 | | void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 | | void write(String str) | 写一个字符串 | | void write(String str, int off, int len) | 写一个字符串的一部分 |
flush() 刷新流,还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数

3 字符输入流

  • 构造方法 :
    • public FileReader(File file) : 从指定的File路径中读取数据
    • public FileReader(String fileName) : 从指定的String路径中读取数据 | int read() | 一次读一个字符数据 | | —- | —- | | int read(char[] cbuf) | 一次读一个字符数组数据 |

4 字符缓冲流

  • public BufferedWriter(Writer out) : 构造方法中需要接收一个基本的字符输出流
  • public BufferedReader(Reader in) : 构造方法中需要接收一个基本的字符输入流

    4.1字符缓冲流特有的功能

  • BufferedWriter类:

    • void newLine():写一个行分隔符,会根据操作系统的不同,写入不同的行分隔符
  • BufferedReader类

    • public String readLine() :读取文件一行数据, 不包含换行符号 , 读到文件的末尾返回null

      5 转换流

  • InputStreamReader是从字节流到字符流的桥梁

    • public InputStreamReader(InputStream in) : 创建一个使用默认编码的 InputStreamReader。
    • public InputStreamReader(InputStream in , String charsetName) : 创建使用指定编码的 InputStreamReader。
  • OutputStreamWriter是从字符流到字节流的桥梁

    • public OutputStreamWriter(OutputStream out) : 创建使用默认字符编码的 OutputStreamWriter
    • public OutputStreamWriter(OutputStream out, String charsetName) : 创建使用指定编码的 OutputStreamWriter。

      6 对象操作流

  • ObjectOutputStream :

    • 对象操作输出流(对象序列化流):就是将对象写到本地文件中,或者在网络中传输对象
  • ObjectInputStream :

    • 对象操作输入流(对象反序列化流):把写到本地文件中的对象读到内存中,或者接收网络中传输的对象

      6.1 对象操作流的注意事项

  • 如果一个类对象想要被序列化 , 那么此类需要实现Serializable接口

  • Serializable接口的含义 :
    • 是一个标记性接口 , 里面没有任何抽象方法
    • 只要一个类实现了此接口 , 表示此类的对象可以被序列化
  • 假如我们修改了对象所属的Javabean类,InvalidClassException异常
  • 如何解决:
    • 给对象所属的类加一个serialVersionUID
      • private static final long serialVersionUID = 42L;
  • 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程

    7 装饰设计模式

    ```java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; /* 装饰模式指的是在不改变原类, 不使用继承的基础上,动态地扩展一个对象的功能

    使用原则 :

    1. 1. 装饰类和被装饰类需要有共同的父类型。
    2. 2. 装饰类要传入被装饰类的对象
    3. 3. 在装饰类中把要增强扩展的功能进行扩展
    4. 4. 对于不要增强的功能直接调用

    需求 : 在不改变LiuDeHua类,及不使用继承的技术前提下,动态的扩展LiuDeHua的sing功能。

    1. LiuDeHua就是一个被装饰类 , 需要对唱歌的功能进行扩展

    步骤:

    1. 1. 创建LiuDeHua类并实现接口Star【被装饰类】
    2. 2. 定义一个装饰类LiuDeHuaWrapper实现Star 【装饰类】
    3. 3. 在装饰类里面定义一个成员变量类型是LiuDeHua,可以使用构造方法进行传入被装饰类对象。
    4. 4. 在装饰类中对sing方法进行功能扩展
    5. 5. dance不做改动
    6. 6. 测试类分别创建装饰类的对象和被装饰类的对象。将被装饰类对象刘德华对象设置给装饰类对象

    */ public class Test { public static void main(String[] args) throws IOException {

    1. // 被装饰类对象
    2. LiuDeHua huaZai = new LiuDeHua();// 0x001
    3. // 装饰类对象
    4. LiuDeHuaWrapper liuDeHuaWrapper = new LiuDeHuaWrapper(huaZai);
    5. liuDeHuaWrapper.sing();
    6. liuDeHuaWrapper.dance();

// // 被装饰类对象 // FileWriter fw = new FileWriter(“路径”); // // 装饰类对象 // BufferedWriter bw = new BufferedWriter(fw); } }

// 1. 创建LiuDeHua类并实现接口Star【被装饰类】 class LiuDeHua implements Star {

  1. @Override
  2. public void sing() {
  3. System.out.println("唱忘情水...");
  4. }
  5. @Override
  6. public void dance() {
  7. System.out.println("华仔在跳老年迪斯高..");
  8. }

}

// 2. 定义一个装饰类LiuDeHuaWrapper实现Star 【装饰类】 class LiuDeHuaWrapper implements Star { // 3. 在装饰类里面定义一个成员变量类型是LiuDeHua,可以使用构造方法进行传入被装饰类对象。 private LiuDeHua huaZai;// 0x001

  1. public LiuDeHuaWrapper(LiuDeHua huaZai) {// 0x001
  2. this.huaZai = huaZai;
  3. }
  4. @Override
  5. public void sing() {
  6. // 4. 在装饰类中对sing方法进行功能扩展
  7. System.out.print("华仔深情");
  8. huaZai.sing();
  9. }
  10. @Override
  11. public void dance() {
  12. // 5. 对dance不做改动
  13. huaZai.dance();
  14. }

}

// 明星接口 , 装饰类和被装饰类的父类型 interface Star { public abstract void sing(); // 唱歌

  1. public abstract void dance();// 跳舞

} ```

8 commons-io工具包

  • public static void copyFileToDirectory(final File srcFile, final File destFile): 复制文件到另外一个目录下。
  • public static void copyDirectoryToDirectory(File src , File dest ):复制src目录到dest位置。