3/23day17_缓冲流_转换流_序列化流_打印流_装饰设计模

2020-03-23  本文已影响0人  蹦蹦跶跶的起床啊

复习

1.字符流
    FileWriter FileReader
2.ResourceBundle
3.Properties
    a.都可以读取Properties配置文件
    区别:
        a.ResourceBundle是静态方法getBundle,Properties成员方法load
        b.ResourceBundle一般读取src根目录下,Properties一般读取项目根目录下
        c.ResourceBundle读取时只需要写文件名(不带后缀), Properties读取时文件名要写全名
            
4.异常处理    
    JDK1.7之前
        try{
            
        }catch(Exception e){
            
        }finally{
            xxx.close();
        }
    JDK1.7以及之后
        try(FileReader fr = new FileReader("1.txt")){
            
        }catch(Exception e){
            
        }
    

今日内容


缓冲流

缓冲流的介绍

缓冲流的分类

字节缓冲流的介绍和使用

字符缓冲流的介绍和使用

public static void main(String[] args) throws IOException {
    ArrayList<String> list = new ArrayList<>();
    BufferedReader br = new BufferedReader(new FileReader("1.txt"));
    String line ="";
    while ((line = br.readLine()) != null) {
        list.add(line);
    }
    br.close();
    /* Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.charAt(0)-o1.charAt(0);
            }
        });*/
    Collections.sort(list,((o1, o2) -> o1.charAt(0)-o2.charAt(0)));
    /*for (String s : list) {
            System.out.println(s);
        }*/
    BufferedWriter bw = new BufferedWriter(new FileWriter("2"));
    for (String s : list) {
        bw.write(s);
        bw.newLine();
    }
    bw.close();
}

转换流

编码和解码

字符集

字符集 Charset :也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。

字符编码

字符编码 Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则。

常见的字符集和字符编码

ASCII 字符集 --> ASCII 编码 , 规定了ASCII字符集中所有的字符都占1个字节(0-127)用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显
示字符(英文大小写字符、阿拉伯数字和西文符号)。

GBK字符集 ---> GBK编码, 规定所有的中文字符都占2个字节(这2个字节都是负数).是为了显示中文而设计的一套字符集。

Unicode字符集 ---> UTF-8编码, 规定所有中文字符都占3个字节,Unicode编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。

ISO-8859-1字符集 ---> 用于显示欧洲使用的语言

编码引出的问题

IDEA默认使用UTF-8编码, windows默认使用GBK编码

public class ReaderDemo {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("E:\\File_GBK.txt");
        int read;
        while ((read = fileReader.read()) != -1) {
            System.out.print((char)read);
        }
        fileReader.close();
    }
}
输出结果:
���

使用转换流InputStreamReader类解决读取中文的问题

转换流 java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

使用转换流OutputStreamReader类写不同编码的中文

转换流 java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

转换流的理解

转换流代码案例

public static void main(String[] args) throws Exception{
    InputStreamReader isr = new InputStreamReader(new FileInputStream("GBK.txt"), "GBK");
    OutputStreamWriter ops = new OutputStreamWriter(new FileOutputStream("UTF-8.TXT"), "UTF-8");
    int ch=0 ;
    while ((ch = isr.read()) != -1) {
        ops.write((char)ch);
    }
    isr.close();
    ops.close();
}

序列化

序列化流概述

ObjectOutputStream类的介绍和使用

ObjectInputStream类的介绍和使用

反序列化可能会出现的异常

序列化多个对象


打印流(PrintStream)

打印流的介绍

System.out.println()在控制台打印输出,是调用print 方法和 println 方法完成的,这两个方法都来自于java.io.PrintStream 类(成为打印流),该类能够方便地打印各种数据类型的值(打印流中重写了各种数据类型的printprintlin方法),是一种便捷的输出方式。

打印流的用法


装饰设计模式

设计模式是指, 前辈们为了解决一系列问题设计的方案

在我们今天所学的缓冲流中涉及到java的一种设计模式,叫做装饰模式.

装饰设计模式概述(作用)

指在不改变原类, 不适用继承的基础上, 动态地扩展一个对象的功能.

装饰设计模式的4个基本步骤

装饰设计模式代码演示

  1. 先提供方法接口

    public interface Star {
        public void sing();
        public void dance();
    }
    
  2. 让原类去实现接口

    public class LiuDeHua implements Star {
        @Override
        public void sing() {
            System.out.println("刘德华在唱忘情水...");
        }
        @Override
        public void dance() {
            System.out.println("刘德华在跳街舞...");
        }
    }
    
  3. 写装饰类,在装饰类中扩展

    /*
        装饰模式遵循原则:
            装饰类和被装饰类必须实现相同的接口
            在装饰类中必须传入被装饰类的引用
            在装饰类中对需要扩展的方法进行扩展
            在装饰类中对不需要扩展的方法调用被装饰类中的同名方法
    */
    public class LiuDeHuaWarpper implements Star {
        // 存放被装饰类的引用
        private LiuDeHua liuDeHua;
        // 通过构造器传入被装饰类对象
        public LiuDeHuaWarpper(LiuDeHua liuDeHua){
            this.liuDeHua = liuDeHua;
        }
        @Override
        public void sing() {
            // 对需要扩展的方法进行扩展增强
            System.out.println("刘德华在鸟巢的舞台上演唱忘情水.");
        }
        @Override
        public void dance() {
            // 不需要增强的方法调用被装饰类中的同名方法
            liuDeHua.dance();
        }
    }
    

commons-io工具包

commons-io工具包概述

commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以挺提高IO功能开发的效率。commons-io工具包提供了很多有关io操作的类,见下表:

功能描述
org.apache.commons.io 有关Streams、Readers、Writers、Files的工具类
org.apache.commons.io.input 输入流相关的实现类,包含Reader和InputStream
org.apache.commons.io.output 输出流相关的实现类,包含Writer和OutputStream
org.apache.commons.io.serialization 序列化相关的类

commons-io工具包 使用步骤

步骤:

  1. 下载commons-io相关jar包;http://commons.apache.org/proper/commons-io/
  2. 把commons-io-2.6.jar包复制到指定的Module的lib目录中(必须在指定的Module的lib目录下, lib目录和src目录为同级目录)
  3. 将commons-io-2.6.jar加入到classpath中(IDEA中右键该工具包选择Add as Libary表示添加到本模块中作为工具库)

commons-io工具包常用API


今日小结

1.缓冲流【重点】
字节缓冲流(BufferedOutputStream和BufferedInputStream),没有特有方法,性能比普通流更高

字符缓冲流(BufferedWriter和BufferedReader),有特有方法,性能比普通流更高
  BufferedWriter: 
      public void newLine();
  BufferedReader:
      public String readLine();

2.转换流【重点】
转换输出流: 可以指定编码写文件
OutputStreamWriter
public OutputStreamWriter(OutputStream out,String 指定的编码);
转换输入流: 可以指定编码读文件
InputStreamReader
public InputStreamReader(InputStream in,String 指定的编码);

3.序列化流【理解】
序列化流: 写对象
ObjectOutputStream
public void writeObject(对象);//该对象的类必须实现java.io.Serializable接口
反序列化流: 读对象
ObjectInputStream
public Object readObject();
4.打印流【理解】
PrintStream ps = new PrintStream(String path/File file/OutputStream out);
方法:
print(各种数据类型);
println(各种数据类型);

5.装饰设计模式【理解】
步骤:
a.被装饰类和装饰类实现同一个接口
b.装饰类内部必须含有被装饰类的引用
c.在装饰类中对需要装饰的方法进行装饰
d.在装饰类中对不需要装饰的方法调用原对象的方法

6.commons-io【重点】
IOUtils 复制文件(2G以上和2G以下)
FileUtils 复制文件和复制文件夹

上一篇下一篇

猜你喜欢

热点阅读