今日学习目标
- 编码表
- 字符输出流
- 字符输入流
- 字符缓冲流
- 转换流
- 对象操作流
- 装饰模式
- 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类
InputStreamReader是从字节流到字符流的桥梁
- public InputStreamReader(InputStream in) : 创建一个使用默认编码的 InputStreamReader。
- public InputStreamReader(InputStream in , String charsetName) : 创建使用指定编码的 InputStreamReader。
OutputStreamWriter是从字符流到字节流的桥梁
ObjectOutputStream :
- 对象操作输出流(对象序列化流):就是将对象写到本地文件中,或者在网络中传输对象
ObjectInputStream :
如果一个类对象想要被序列化 , 那么此类需要实现Serializable接口
- Serializable接口的含义 :
- 是一个标记性接口 , 里面没有任何抽象方法
- 只要一个类实现了此接口 , 表示此类的对象可以被序列化
- 假如我们修改了对象所属的Javabean类,InvalidClassException异常
- 如何解决:
- 给对象所属的类加一个serialVersionUID
- private static final long serialVersionUID = 42L;
- 给对象所属的类加一个serialVersionUID
给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
7 装饰设计模式
```java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; /* 装饰模式指的是在不改变原类, 不使用继承的基础上,动态地扩展一个对象的功能
使用原则 :
1. 装饰类和被装饰类需要有共同的父类型。2. 装饰类要传入被装饰类的对象3. 在装饰类中把要增强扩展的功能进行扩展4. 对于不要增强的功能直接调用
需求 : 在不改变LiuDeHua类,及不使用继承的技术前提下,动态的扩展LiuDeHua的sing功能。
LiuDeHua就是一个被装饰类 , 需要对唱歌的功能进行扩展
步骤:
1. 创建LiuDeHua类并实现接口Star【被装饰类】2. 定义一个装饰类LiuDeHuaWrapper实现Star 【装饰类】3. 在装饰类里面定义一个成员变量类型是LiuDeHua,可以使用构造方法进行传入被装饰类对象。4. 在装饰类中对sing方法进行功能扩展5. 对dance不做改动6. 测试类分别创建装饰类的对象和被装饰类的对象。将被装饰类对象刘德华对象设置给装饰类对象
*/ public class Test { public static void main(String[] args) throws IOException {
// 被装饰类对象LiuDeHua huaZai = new LiuDeHua();// 0x001// 装饰类对象LiuDeHuaWrapper liuDeHuaWrapper = new LiuDeHuaWrapper(huaZai);liuDeHuaWrapper.sing();liuDeHuaWrapper.dance();
// // 被装饰类对象 // FileWriter fw = new FileWriter(“路径”); // // 装饰类对象 // BufferedWriter bw = new BufferedWriter(fw); } }
// 1. 创建LiuDeHua类并实现接口Star【被装饰类】 class LiuDeHua implements Star {
@Overridepublic void sing() {System.out.println("唱忘情水...");}@Overridepublic void dance() {System.out.println("华仔在跳老年迪斯高..");}
}
// 2. 定义一个装饰类LiuDeHuaWrapper实现Star 【装饰类】 class LiuDeHuaWrapper implements Star { // 3. 在装饰类里面定义一个成员变量类型是LiuDeHua,可以使用构造方法进行传入被装饰类对象。 private LiuDeHua huaZai;// 0x001
public LiuDeHuaWrapper(LiuDeHua huaZai) {// 0x001this.huaZai = huaZai;}@Overridepublic void sing() {// 4. 在装饰类中对sing方法进行功能扩展System.out.print("华仔深情");huaZai.sing();}@Overridepublic void dance() {// 5. 对dance不做改动huaZai.dance();}
}
// 明星接口 , 装饰类和被装饰类的父类型 interface Star { public abstract void sing(); // 唱歌
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位置。
