Java-缓冲流

在这里插入图片描述
字节缓冲流:
BufferedOutputStream:字节缓冲输出流

package dl.java.day27.Demo01;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
    java.io.BufferedOutputStream extends OutputStream
    BufferedOutputStream:字节缓冲输出流

    继承父类的共性成员方法:
        public void close():关闭此输出流并释放与此流相关联的任何系统资源
        public void flush():刷新此输出流并强制任何缓冲的输出字节被重写
        public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流
        public void write(byte[] b,int off, int len):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流
        public abstract void write(int b):将指定字节的输出流
    构造方法:
        BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流
        BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流
        参数:
            OutputStream:字节输出流
                可以传递FileOutputStream,缓冲区会给FileOutputStream增加一个缓冲区,提高FileOutputStream写入效率
            int size:指定缓冲流内部缓冲区的大小,不指定就是默认
    使用步骤:重点
        1.创建一个FileOutputStream对象,构造方法绑定目的地
        2.创建缓冲流BufferedOutputStream对象,构造方法传递FileOutputStream对象,提高FileOutputStream效率
        3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区
        4.使用BufferedOutputStream对象中的方法flush,把内部缓冲区的数据刷新到文件中
        5.释放资源(会先调用flush方法,第四步可省略)
 */
public class Demo01BufferedOutputStream {
    public static void main(String[] args) throws IOException {
        //1.创建一个FileOutputStream对象,构造方法绑定目的地
        FileOutputStream fos = new FileOutputStream("E:\\java\\java_project\\day11-code\\src\\dl\\java\\day27\\a.txt");
        // 2.创建缓冲流BufferedOutputStream对象,构造方法传递FileOutputStream对象
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区
        bos.write("把数据写入内部缓冲区".getBytes());
        //4.使用BufferedOutputStream对象中的方法flush,把内部缓冲区的数据刷新到文件中
        //bos.flush();
        //5.释放资源(会先调用flush方法,第四步可省略)
        bos.close();
    }
}

字节缓冲输入流:BufferedInputStream

package dl.java.day27.Demo01;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

/*
    java.io.BufferedInputStream extends InputStream
    BufferedInputStream:字节缓冲输入流

    继承父类的成员方法:
        int read() 从输入流中读取数据的下一个字节
        int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
        void close() 关闭此输入流并释放与该流关联的所有系统资源
    构造方法:
        BufferedInputStream(InputStream in) 创建一个BufferedInputStream并保存其参数,即输入流in,方便以后使用
        BufferedInputStream(InputStream in, int size) 创建指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in,方便以后使用
        参数:
            InputStream:字节输入流
                传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream读取效率
            int size:指定缓冲流内部缓冲区的大小,不指定就是默认
    使用步骤:重点
        1.创建一个FileInputStream对象,构造方法绑定目的地
        2.创建BufferedInputStream对象,构造方法传递FileInputStream对象,提高FileInputStream效率
        3.使用BufferedInputStream对象中的方法read,读取文件
        4.释放资源
 */
public class Demo02BufferedInputStream {
    public static void main(String[] args) throws IOException {
        //1.创建一个FileInputStream对象,构造方法绑定目的地
        FileInputStream fis = new FileInputStream("E:\\java\\java_project\\day11-code\\src\\dl\\java\\day27\\a.txt");
        //2.创建BufferedInputStream对象,构造方法传递FileInputStream对象
        BufferedInputStream bis = new BufferedInputStream(fis);
        //3.使用BufferedInputStream对象中的方法read,读取文件
        //int read()从输入流中读取数据的下一个字节
        /*int len = 0;
        while ((len = bis.read())!=-1){
            System.out.println(len);
        }*/

        //int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
        byte[] bytes = new byte[1024];//存储每次读取的数据
        int len  = 0;
            while ((len = bis.read(bytes))!=-1){
                System.out.println(new String(bytes,0,len));
            }

        bis.close();
    }
}

缓冲流的效率测试–复制文件

package dl.java.day27.Demo02;

import java.io.*;

/*
    文件复制:一读一写
        明确:
            数据源
            目的地
    文件复制步骤:
        1.创建字节缓冲输入流对象,构造方法中传递字节输入流
        2.创建字节缓冲输出流对象,构造方法中传递字节输出流
        3.使用字节缓冲输入流对象中的方法read,读取文件
        4.使用字节缓冲输出流对象中的文件write,把读取的文件写入到内部缓冲区中
        5.释放资源(会先把缓冲区中的数据,刷新到文件中)
 */
public class Demo02CopyFile {
    public static void main(String[] args) throws IOException {
        long s = System.currentTimeMillis();

        //1.创建字节缓冲输入流对象,构造方法中传递字节输入流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\java\\java_project\\day11-code\\src\\dl\\java\\day27\\a.txt"));
        //2.创建字节缓冲输出流对象,构造方法中传递字节输出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:\\a.txt"));
        //3.使用字节缓冲输入流对象中的方法read,读取文件
        //一次读取一个字节写入一个字节的方式
        /*int len = 0;
        while ((len = bis.read())!=-1){
            bos.write(len);
        }*/

        //使用数组缓冲读取多个字节,写入多个字节
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
        }

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

        long e = System.currentTimeMillis();
        System.out.println("复制文件耗时:"+(e-s)+"毫秒");
    }
}

字符缓冲流
BufferedWriter字符缓冲输出流

package dl.java.day27.Demo01;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*
    java.io.BufferedWriter extends Writer
    BufferedWriter:字符缓冲输出流

    继承父类的共性成员方法:
        void write(int c) 写入一个字符
        void writer(char[] cbuf) 写入字符数组
        abstract void write(char[] cbuf,int off, int len) 写入字符数组的一部分,off数组索引,len写入字符个数
        void write(String str) 写入字符串
        void write(String str,int off,int len) 写入字符串的一部分,off字符串索引,len写入个数
        void flush() 刷新该流的缓冲
        void close() 关闭此流,但需要先刷新它
    构造方法:
        BufferedWriter(Writer out) 创建一个默认大小输出缓冲区的缓冲字符输出流
        BufferedWriter(Writer out, int sz) 创建一个给定大小输出缓冲区的新缓冲字符输出流
        参数:
            Writer out:字符输出流
                传递FileWriter,缓冲流会给FileWriter增加一个缓冲区提高FileWriter的写入效率
            int size:指定缓冲区的大小
    特有的成员方法:
        void newLine() 写入一个行分隔符,会根据不同的操作系统,获取不同的行分隔符
        换行:
            Windows:\r\n
            Linux:/n
            Mac:/r
    使用步骤:
        1.创建字符缓冲输出流对象,构造方法传递字符输出流
        2.调用字符缓冲输出流中的方法write,把数据写入内存缓冲区中
        3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据刷新到文件中
        4.释放资源
 */
public class Demo03BufferedWriter {
    public static void main(String[] args) throws IOException {
        //1.创建字符缓冲输出流对象,构造方法传递字符输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\java\\java_project\\day11-code\\src\\dl\\java\\day27\\b.txt"));
        //2.调用字符缓冲输出流中的方法write,把数据写入内存缓冲区中
        for (int i = 0; i < 10; i++) {
            bw.write("张三");
            //bw.write("\r\n");
            bw.newLine();
        }
        //3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据刷新到文件中
        bw.flush();
        //4.释放资源
        bw.close();
    }
}

字符缓冲输入流:BufferedReader

package dl.java.day27.Demo01;

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

/*
    java.io.BufferedReader extends Reader
    继承父类的共性成员方法:
        int read()  读取单个字符并返回
        int read(char[] cbuf) 一次读取多个字符,将字符读入数组
        void close()  关闭该流并释放与之关联的所有资源
    构造方法:
        BufferedReader(Reader in) 创建一个默认大小输入缓冲区的缓冲字符输入流
        BufferedReader(Reader in, int sz) 创建一个指定大小输入缓冲区的缓冲字符输入流
        参数:
            Reader in:传递FileReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader读取效率
            int size:指定缓冲区的大小
    特有成员方法:
        String readLine() 读取一个文本行 读取一行数据
            行的终止符号:换行 \n,  回车 \r ,回车后跟着换行  \r\n
        返回值:
            包含改行内容的字符串,不包含任何终止符,如果已达到流末尾,则会返回null
    使用步骤:
        1.创建字符缓冲输入流对象,构造方法中传递字符输入流
        2.使用字符缓冲输入流中的方法read/readLine,读取文本
        3.释放资源
 */
public class Demo04BufferedReader {
    public static void main(String[] args) throws IOException {
        //1.创建字符缓冲输入流对象,构造方法中传递字符输入流
        BufferedReader br = new BufferedReader(new FileReader("E:\\java\\java_project\\day11-code\\src\\dl\\java\\day27\\b.txt"));
        //2.使用字符缓冲输入流中的方法read/readLine,读取文本
        /*String line = br.readLine();
        System.out.println(line);*/

        String line;
        while ((line = br.readLine())!=null){
            System.out.println(line);
        }

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

练习:文本排序
在这里插入图片描述

package dl.java.day27.Demo01;

import java.io.*;
import java.util.HashMap;

/*
    练习:
        对文本的内容进行排序
        按照(1,2,...)排序
    分析:
        1.创建一个HashMap集合对象,可以:存储每行文本的序号;value存储每行的文本
        2.创建字符缓冲输入流对象,构造方法中用字符输入流
        3.创建字符缓冲输出流对象,构造方法中用字符输出流
        4.使用字符缓冲输入流中的方法readLine,逐行读取文本
        5.对读取到的文本进行切割,获取行中的序号和文本的内容
        6.把切割好的序号和文本内容存储到HashMap集合中(key序号是有序的,会自动排序)
        7.遍历HashMap集合,获取每一个键值对
        8.把每一个键值对拼接为一个文本行
        9.把拼接好的文本行,使用字符缓冲流中的方法write,写入到文件中
        10.释放资源
 */
public class Demo05Text {
    public static void main(String[] args) throws IOException {
        //1.创建一个HashMap集合对象,可以:存储每行文本的序号;value存储每行的文本
        HashMap<String,String> map = new HashMap<>();
        //2.创建字符缓冲输入流对象,构造方法中用字符输入流
        BufferedReader br = new BufferedReader(new FileReader("E:\\java\\java_project\\day11-code\\src\\dl\\java\\day27\\c.txt"));
        //3.创建字符缓冲输出流对象,构造方法中用字符输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\java\\java_project\\day11-code\\src\\dl\\java\\day27\\out.txt"));
        //4.使用字符缓冲输入流中的方法readLine,逐行读取文本
        String line;
        while ((line = br.readLine())!=null){
            //5.对读取到的文本进行切割,获取行中的序号和文本的内容
            String[] arr = line.split("\\.");
            //6.把切割好的序号和文本内容存储到HashMap集合中(key序号是有序的,会自动排序)
            map.put(arr[0],arr[1]);
        }
        //7.遍历HashMap集合,获取每一个键值对
        for (String key: map.keySet()){
            String value = map.get(key);
            //8.把每一个键值对拼接为一个文本行
            line = key+"."+value;
            // 9.把拼接好的文本行,使用字符缓冲流中的方法write,写入到文件中
            bw.write(line);
            bw.newLine();//写换行
        }
        //10.释放资源
        bw.close();
        br.close();
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值