学习目标
- 字符流
- 字符流读写数据
- 字符缓冲流
- 字符缓冲流读写数据
- 转换流
- 字节流转换成字符流
- 序列化流
- 序列化与反序列化数据
- 装饰设计模式
- 装饰设计模式思想
- 装饰设计模式代码
commons-io工具包
ASCII (美国信息交换标准码表) 包括了数字字符,英文大小写字符和一些常见的标点符号字符。(没有中文)
- GBK window系统默认的码表。兼容ASCII码表,也包含了21003个汉字,并支持繁体汉字以及部分日韩文字(GBK是中国的码表,一个中文以两个字节的形式存储。但不包含世界上所有国家的文字)
- Unicode码表 由国际组织ISO 制定,是统一的万国码表,计算机科学领域里的一项业界标准,容纳世界上大多数国家的所有常见文字和符号( Unicode是万国码表,以UTF-8编码后一个中文以三个字节的形式存储)
1.2 字符流的组成 及字符流能解决什么问题 ?
组成:字符流 = 字节流 + 编码表
字符流的作用:字符流能够解决字节流在把文本文件中的内容读取到内存中时,以及把中文写入到文本文件中时,可能会出现乱码的问题。
字节流为什么读中文会出现乱码?因为字节流一次读一个字节,而不管GBK还是UTF-8一个中文都是多个字节,用字节流每次只能读其中的一部分,所以就会出现乱码问题
1.3 字符缓冲流如何使用 ?
//需求:读取文件中的数据 : 33 22 11 55 44
//排序后 : 11 22 33 44 55 再次写到本地文件
public class BufferedStreamDemo3 {
public static void main(String[] args) throws IOException {
//1. 创建高效的字符输入流
BufferedReader br = new BufferedReader(new FileReader("day11_demo\\aa.txt"));
//2 读取文件中的一行数据
//3 将数据按照空格切割
String[] strings = br.readLine().split(" ");
//4 把字符串数组转成int类型数组
int[] arr = new int[strings.length];
for (int i = 0; i < strings.length; i++) {
arr[i]=Integer.parseInt(strings[i]);
}
//5 对int类型的数组进行排序
Arrays.sort(arr);
//6 创建高效的字符输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("day11_demo\\bb.txt"));
//7 遍历数组,把数组中的数据写入到文件中
for (int i = 0; i < arr.length; i++) {
bw.write(arr[i]+" ");
bw.flush();
}
//8 释放资源
br.close();
bw.close();
}
}
1.4 转换流能解决什么问题 ?
转换流就是来进行字节流和字符流之间转换的桥梁
1.5 转换流如何使用 ?
public class ConversionDemo1 {
public static void main(String[] args) throws IOException {
//创建转换输出流
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("Day11_demo\\aa.txt"), "GBK");
//写数据
osw.write("远桥之下泛莲舟");
osw.write("\r\n");
osw.write("岱岩石上松溪流");
osw.write("\r\n");
osw.write("万仞翠山梨亭在");
osw.write("\r\n");
osw.write("莫闻空谷声悠悠");
//释放数据
osw.close();
//创建转换输入流
InputStreamReader isr = new InputStreamReader(new FileInputStream("Day11_demo\\aa.txt"), "GBK");
//写数据
int s;
while ((s=isr.read())!=-1){
System.out.print((char) s);
}
//释放资源
isr.close();
}
}
2.设计模式
2.1 装饰者模式能解决什么问题
- 装饰类和被装饰类需要有共同的父类型。
- 在之前学习过的 BufferedWriter 和 FileWriter 就是装饰设计模式
- BufferedWriter的父类为Writer
- FileWriter的父类也是Writer
- 我们把FileWriter的对象传递到BufferedWriter的构造中 , 那么可以理解为BufferedWriter是装饰类 , FileWriter是被装饰类
- BufferedWriter对FileWriter的功能做了增强
- 装饰类的构造要接收被装饰类的对象
- FileWriter fw = new FileWriter(“路径”);
- BufferedWriter bw = new BufferedWriter(fw);
- 在装饰类中把要增强扩展的功能进行扩展
- BufferedWriter和FileWriter的功能一样, 都具备Writer中写数据的功能
- 但是BufferedWriter提供了缓冲区 , 相当于对FileWriter功能做了扩展
- 对于不要增强的功能直接调用
- 不需要增强的功能直接继承父类的即可