Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】

    

目   录

01_字节缓冲流

2.7、字节缓冲流

02_字节流复制视频

案例:复制视频

03_为什么出现字符流

3.1、为什么出现字符流

3.2、编码表

05_字符串中的编码解码问题

3.3、字符串中的编码解码问题

06_字符流中的编码解码问题

3.4、字符流中的编码解码问题 

07_字符流写数据的5种方式

3.5、字符流写数据的5种方式

08_字符流读数据的2种方式

3.6、字符流读数据的2种方式

09_字符流复制Java文件

案例:复制Java文件

10_字符流复制Java文件改进版

案例:复制Java文件(改进版)

1、API——FileWriter

2、API——FileReader

11_字符缓冲流

3.7、字符缓冲流

1、API——BufferedReader

2、API——BufferedWriter

12_字符缓冲流复制Java文件

案例:复制Java文件(字符缓冲流改进版)

13_字符缓冲流特有功能

3.8、字符缓冲流特有功能

14_字符缓冲流特有功能复制Java文件

案例:复制Java文件(字符缓冲流特有功能改进版)

15_IO流小结

3.9、IO流小结

1、字节流

2、字符流

16_集合到文件

案例:集合到文件

17_文件到集合

案例:文件到集合

18_点名器

案例:点名器

19_集合到文件改进版

案例:集合到文件(改进版)

1、Student.java

2、ArrayListToFileDemo.java

20_文件到集合改进版

案例:文件到集合(改进版)


01_字节缓冲流

2.7、字节缓冲流

字节缓冲流(提高数据读写效率)介绍

  • BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
  • BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。

构造方法:

  • BufferedOutputStream(OutputStream out):创建字节缓冲输出流对象
  • BufferedInputStream(InputStream in):创建字节缓冲输入流对象

为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?

  • 字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作。

Class BufferedOutputStream:该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。BufferedOutputStream是具体类;FileOutputStream写字节数据时,会导致底层系统的调用;BufferedOutputStream可以向FileOutputStream写数据,通过设置缓冲区,以后可以一次性把数据写到文件中,底层调用次数减少,效率提高。

Class BufferedInputStream:提高读取数据的效率。

 

02_字节流复制视频

案例:复制视频

 

package com.itheima_03;

import java.io.*;

/*
    需求:
        把E:\\itcast\\字节流复制图片.avi 复制到模块目录下的 字节流复制图片.avi

    思路:
        1:根据数据源创建字节输入流对象
        2:根据目的地创建字节输出流对象
        3:读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
        4:释放资源

    四种方式实现复制视频,并记录每种方式复制视频的时间
        1:基本字节流一次读写一个字节             共耗时:64565毫秒
        2:基本字节流一次读写一个字节数组          共耗时:107毫秒
        3:字节缓冲流一次读写一个字节             共耗时:405毫秒
        4:字节缓冲流一次读写一个字节数组          共耗时:60毫秒
 */
public class CopyAviDemo {
    public static void main(String[] args) throws IOException {
        //记录开始时间
        long startTime = System.currentTimeMillis();
        //复制视频
        method1();
        //记录结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("(1)共耗时:" + (endTime - startTime) + "毫秒");

        startTime = System.currentTimeMillis();
        method2();
        endTime = System.currentTimeMillis();
        System.out.println("(2)共耗时:" + (endTime - startTime) + "毫秒");

        startTime = System.currentTimeMillis();
        method3();
        endTime = System.currentTimeMillis();
        System.out.println("(3)共耗时:" + (endTime - startTime) + "毫秒");

        startTime = System.currentTimeMillis();
        method4();
        endTime = System.currentTimeMillis();
        System.out.println("(4)共耗时:" + (endTime - startTime) + "毫秒");
    }

    //字节缓冲流一次读写一个字节数组
    public static void method4() throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("字节流复制图片4.avi"));

        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }

        bos.close();
        bis.close();
    }

    //字节缓冲流一次读写一个字节
    public static void method3() throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("字节流复制图片3.avi"));

        int by;
        while ((by = bis.read()) != -1) {
            bos.write(by);
        }

        bos.close();
        bis.close();
    }


    //基本字节流一次读写一个字节数组
    public static void method2() throws IOException {
        //E:\\itcast\\字节流复制图片.avi
        //模块目录下的 字节流复制图片.avi
        FileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
        FileOutputStream fos = new FileOutputStream("字节流复制图片2.avi");

        byte[] bys = new byte[1024];
        int len;
        while ((len = fis.read(bys)) != -1) {
            fos.write(bys, 0, len);
        }

        fos.close();
        fis.close();
    }

    //基本字节流一次读写一个字节
    public static void method1() throws IOException {
        //E:\\itcast\\字节流复制图片.avi
        //模块目录下的 字节流复制图片.avi
        FileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
        FileOutputStream fos = new FileOutputStream("字节流复制图片1.avi");

        int by;
        while ((by = fis.read()) != -1) {
            fos.write(by);
        }

        fos.close();
        fis.close();
    }
}

03_为什么出现字符流

3.1、为什么出现字符流

字符流的介绍

由于字节流操作中文不是特别的方便,所以Java就提供字符流。

  • 字符流 = 字节流 + 编码表

中文的字节存储方式

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?

  • 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数。

04_编码表

3.2、编码表

基础知识:

  • 计算机中储存的信息都是用二进制数表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。
  • 按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。这里强调一下:按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符号。否则就会导致乱码现象。

      字符编码:就是一套自然语言的字符与二进制数之间的对应规则(A, 65)

字符集:

  • 是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
  • 计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。

      常见字符集有ASCII字符集、GBXXX字符集、Unicode字符集等。

   

05_字符串中的编码解码问题

3.3、字符串中的编码解码问题

06_字符流中的编码解码问题

3.4、字符流中的编码解码问题 

字符流抽象基类

  • Reader:字符输入流的抽象类
  • Writer:字符输出流的抽象类

字符流中和编码解码问题相关的两个类:

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

    它读取字节,并使用指定的编码将其解码为字符

    它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

  • OutputStreamWriter:是从字符流到字节流的桥梁

    是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节

    它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

   

   

07_字符流写数据的5种方式

3.5、字符流写数据的5种方式

构造方法:OutputStreamWriter​(OutputStream out):创建一个使用默认字符编码的OutputStreamWriter

08_字符流读数据的2种方式

3.6、字符流读数据的2种方式

构造方法:InputStreamReader​(InputStream in):创建一个使用默认字符集的InputStreamReader

字节流、字符流 读数据的方式一样!

09_字符流复制Java文件

案例:复制Java文件

10_字符流复制Java文件改进版

案例:复制Java文件(改进版)

简化书写,使用FileWriter、FileReader。编码解码问题:需要使用转换流lnputStreamReader、OutputStreamReader。

1、API——FileWriter

2、API——FileReader

11_字符缓冲流

3.7、字符缓冲流

字符缓冲流介绍

  • BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途。
  • BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。

构造方法

  • BufferedWriter(Writer out)   创建字符缓冲输出流对象
  • BufferedReader(Reader in) 创建字符缓冲输入流对象

1、API——BufferedReader

2、API——BufferedWriter

封装长度为8192长度的字符数组。

  

12_字符缓冲流复制Java文件

案例:复制Java文件(字符缓冲流改进版)

13_字符缓冲流特有功能

3.8、字符缓冲流特有功能

BufferedWriter:
    void newLine():写一行行分隔符,行分隔符字符串由系统属性定义。适应不同的系统:Windows:\r\n;Linux:\n;Mac:\r

BufferedReader:
    public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null。

14_字符缓冲流特有功能复制Java文件

案例:复制Java文件(字符缓冲流特有功能改进版)

15_IO流小结

3.9、IO流小结

抽象类:InputStream、OutputStream 

1、字节流

2、字符流

16_集合到文件

案例:集合到文件

17_文件到集合

案例:文件到集合

18_点名器

案例:点名器

19_集合到文件改进版

案例:集合到文件(改进版)

1、Student.java

package com.itheima_06;

public class Student {
    private String sid;
    private String name;
    private int age;
    private String address;

    public Student() {
    }

    public Student(String sid, String name, int age, String address) {
        this.sid = sid;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

2、ArrayListToFileDemo.java

package com.itheima_06;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class ArrayListToFileDemo {
    public static void main(String[] args) throws IOException {
        //2:创建ArrayList集合
        ArrayList<Student> array = new ArrayList<Student>();
        //3:创建学生对象
        Student s1 = new Student("itheima001", "林青霞", 30, "西安");
        Student s2 = new Student("itheima002", "张曼玉", 35, "武汉");
        Student s3 = new Student("itheima003", "王祖贤", 33, "郑州");
        //4:把学生对象添加到集合中
        array.add(s1);
        array.add(s2);
        array.add(s3);
        //5:创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("students.txt"));
        //6:遍历集合,得到每一个学生对象
        for (Student s : array) {
            //7:把学生对象的数据拼接成指定格式的字符串
            StringBuilder sb = new StringBuilder();
            sb.append(s.getSid()).append(",").append(s.getName()).append(",").
                    append(s.getAge()).append(",").append(s.getAddress());
            //8:调用字符缓冲输出流对象的方法写数据
            bw.write(sb.toString());
            bw.newLine();
            bw.flush();
        }
        //9:释放资源
        bw.close();
    }
}

20_文件到集合改进版

案例:文件到集合(改进版)

 

package com.itheima_06;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class FileToArrayListDemo {
    public static void main(String[] args) throws IOException {
        //2:创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("students.txt"));

        //3:创建ArrayList集合对象
        ArrayList<Student> array = new ArrayList<Student>();

        //4:调用字符缓冲输入流对象的方法读数据
        String line;
        while ((line = br.readLine()) != null) {
            //5:把读取到的字符串数据用split()进行分割,得到一个字符串数组
            String[] strArray = line.split(",");

            //6:创建学生对象
            Student s = new Student();
            //7:把字符串数组中的每一个元素取出来对应的赋值给学生对象的成员变量值
            //itheima001,林青霞,30,西安
            s.setSid(strArray[0]);
            s.setName(strArray[1]);
            s.setAge(Integer.parseInt(strArray[2]));
            s.setAddress(strArray[3]);

            //8:把学生对象添加到集合
            array.add(s);
        }

        //9:释放资源
        br.close();

        //10:遍历集合
        for (Student s : array) {
            System.out.println(s.getSid() + "," + s.getName() + "," + s.getAge() + "," + s.getAddress());
        }
    }
}

终于看完了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

upward337

谢谢老板~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值