Buffered缓冲流

缓冲流

    字节缓冲流:
        字节输入缓冲流:BufferedInputStream
        字节输出缓冲流:BufferedOutputStream
    字符缓冲流:
        字符输入缓冲流:BufferedReader
        字符输出缓冲流:BufferedWriter


    缓冲流特点是快,因为内部有一个缓冲区,可以提高效率。
    缓冲流其实本身并不具备读或者写的功能,它的作用其实是为其他流加速。

    缓冲流的使用步骤(和我们昨天学的流一样):
        1. 创建一个缓冲流对象。
        2. 调用read方法读或者调用write方法写。
        3. 释放资源。

    字节缓冲流的构造方法
        BufferedInputStream​(InputStream in):参数需要传递字节输入流。
        BufferedOutputStream​(OutputStream out): 参数需要传递字节输出流。


    使用缓冲流完成文件的复制
    //110ms
 */
public class Demo02BufferedStream {
    public static void main(String[] args) throws IOException {
        //创建字节缓冲输入流用来读取
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo01_bufferedstream\\bb.jpg"));
        //创建字节缓冲输出流用来写入
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo01_bufferedstream\\cc.jpg"));
        //当前时间
        long start = System.currentTimeMillis();
        int len;
        while ((len = bis.read()) != -1) {
            bos.write(len);
        }
        long end= System.currentTimeMillis();
        System.out.println(end-start);//110ms
        bis.close();
        bos.close();
    }
}
/*
    使用缓冲流一次读写一个字节数组的方式复制文件

    10ms
 */
public class Demo03BufferedStream {
    public static void main(String[] args) throws IOException {
        //1创建一个BufferedInputStream
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bb.jpg"));
        //2 创建一个BufferedOutPutStream用来接收复制来的图片
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo01_bufferedstream\\aa.jpg"));
        //创建一个字节数组用来高效复制
        byte arr[] = new byte[1024 * 8];
        int ien;
        //一次复制一个数组,ien为读取到的长度
        long start = System.currentTimeMillis();
        while ((ien = bis.read(arr)) != -1) {
            bos.write(arr, 0, ien);
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);//15ms


    }
/*
    字符缓冲流:
        字符输出缓冲流: BufferedWriter
        字符输入缓冲流: BufferedReader

    字符缓冲流本身也不具备读或者写的功能,它的作用是为其他流提供加速。

    使用步骤和昨天学的基本的字符流基本一致。

    步骤
        1. 创建缓冲流对象
        2. 调用write方法写或者调用read方法读。 (读或者写的方法和昨天学的一样)
        3. 刷新(字符流写的时候要刷新, 读的时候不需要刷新)
        4. 释放资源


    字符缓冲流的构造方法:
        BufferedWriter​(Writer out):传递一个字符输出流。
        BufferedReader​(Reader in): 传递一个字符输入流

 */

import java.io.*;

public class Demo01BufferedStream {
    public static void main(String[] args) throws IOException {
        method1();
        method2();
    }
    public static void method2() throws IOException {
        //创建一个字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("file01.txt"));

        //调用read方法,进行读取。

        //一次读取一个字符
        /*
        int i;
        while ((i = br.read()) != -1) {
            System.out.print((char) i);
        }
        */

        //一次读取一个字符数组
        char[] cArr = new char[1024];
        int len;
        while((len = br.read(cArr)) != -1) {
            System.out.print(new String(cArr, 0, len));
        }


        //释放资源
        br.close();
    }

    //使用字符缓冲流向文件中写数据
    public static void method1() throws IOException {
        //创建一个字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("file01.txt"));
        //调用方法,写数据
        bw.write("你好,你今天早上做头发了吗");
        //刷新
        bw.flush();
        //释放资源
        bw.close();
    }
}
/*
        字符缓冲流中独有的方法(重要)

        BufferedWriter中有一个方法,可以实现一个跨平台的换行。
        void newLine​()

        BufferedReader中有一个方法,可以每次读取一行数据。
        String readLine​(): 读取一行数据。返回值是读取到的这行数据。如果读取结束,返回null
        readLine方法不会读取换行符,如果要换行,需要我们手动实现
        */
public class Demo02BufferedStream {
    public static void main(String[] args) throws IOException {
       method2();
    }
    public static void method2() throws IOException {
        //创建字符缓冲输入流
        BufferedReader br=new BufferedReader(new FileReader("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo02buffered_stream\\aa.txt"));
        //读取一行数据
        String s = br.readLine();
        String s1 = br.readLine();
        System.out.println(s+"\\r\n"+s1);
        br.close();
    }

    public static void method1() throws IOException {
        //创建缓冲输出流
        FileWriter fw=new FileWriter("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo02buffered_stream\\aa.txt");
        BufferedWriter bw=new BufferedWriter(fw);
        bw.write("江南好曾经旧曾谙");
        bw.newLine();
        bw.write("日出江花红胜火");
        bw.flush();
        bw.close();

    }
}
/*
        给出师表中的内容恢复顺序。

        文件中内容的特点:
        1. 内容是 序号.语句
        2. 序号是唯一的不重复的

        思路:
        1. 定义一个Map集合, key为序号,value为后面的内容
        2. 创建一个字符缓冲输入流,用来读取
        3. 开始读,一次读取一行数据。
        4. 每读取到一行数据,那么就根据.进行切割,得到这句话的序号以及内容。
        5. 把序号作为key,把内容作为value放入到Map集合。
        6. 创建一个输出流,用来写
        7. 使用循环,从1开始,最大的Map集合的长度。根据数字获取对应的value。
        8. 把这些内容使用.分隔写入到新的文件中
        9. 换行
        10. 刷新
        11. 关流
        */
public class Demo03BufferdStream {
    public static void main(String[] args) throws IOException {
        //定义一个map集合,key为序号,value为后面的内容
        Map<Integer, String> mp = new HashMap<>();
        //创建字符缓冲输入流读取一行
        BufferedReader br = new BufferedReader(new FileReader("F:\\黑马就业\\day10\\代码\\day10\\出师表.txt"));
        String line;///3. 开始读,一次读取一行数据
        while ((line = br.readLine()) != null) {

            String[] split = line.split("\\.");
            //line里面保存的就是读取到的这行数据
            //4. 每读取到一行数据,那么就根据.进行切割,得到这句话的序号以及内容。
            //split方法是根据正则表达式切割。 而.是正则表达式的特殊字符。 所以需要转义
            Integer key = Integer.parseInt(split[0]);
            //数组中索引为0的元素是 序号。 数组中索引为1的元素是内容
            String value = split[1];
            //5. 把序号作为key,把内容作为value放入到Map集合。
            mp.put(key, value);
        }
        //释放资源
        br.close();
        //创建一个输出流用来写
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\就业班代码\\day010\\src\\cn\\itcast\\demo02buffered_stream\\chushibiao.txt"));
        //使用循环,从1开始,最大到map集合的长度,根据序号获取对应的value
        for (int i = 1; i <= mp.size(); i++) {
            String s = mp.get(i);
            //8. 把这些内容使用.分隔写入到新的文件中
            bw.write(i + "." + s);
            bw.flush();
            bw.newLine();

        }
//释放资源
        bw.close();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_28761767/article/details/81115591