学习目标
- 字符流
- 字符流读写数据
- 字符缓冲流
- 字符缓冲流读写数据
- 转换流
- 字节流转换成字符流
- 序列化流
- 序列化与反序列化数据
- 装饰设计模式
- 装饰设计模式思想
- 装饰设计模式代码
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功能做了扩展
- 对于不要增强的功能直接调用
- 不需要增强的功能直接继承父类的即可
