缓冲流

本文深入探讨了缓冲流的概念、分类及其在字节流和字符流中的应用,通过实例对比了缓冲流与普通流在文件复制任务上的性能差异,展示了缓冲流如何显著提升I/O操作效率,并提供了文本排序的综合案例。
1.缓冲流的介绍

缓冲流也称为高效流,对普通流的性能方面增强(方法上基本和普通流是一模一样的)

##### 2.缓冲流的分类

字节输出流: OutputStream —> BufferedOutputStream 缓冲字节输出流
字节输入流: InputStream —> BufferedInputStream 缓冲字节输入流
字符输出流: Writer —> BufferedWriter 缓冲字符输出流
字符输入流: Reader —> BufferedReader 缓冲字符输入流

3.字节缓冲流的介绍和使用
  • 字节缓冲流的构造

public BufferedOutputStream(OutputStream out);//创建缓冲流需要传入普通流
public BufferedInputStream(InputStream in);//创建缓冲流需要传入普通流

  • 字符缓冲流的高效测试
public class BufferedStreamDemo {
    public static void main(String[] args) throws Exception {
        long start = System.currentTimeMillis();
        copy03();
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
    /**
     * 复制文件:使用缓冲流 39毫秒
     */
    public static void copy03() throws Exception {
        //1.创建两个流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\upload\\666.png"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.png"));
        //2.复制代码(一个一个字节数组复制)
        byte[] bs = new byte[1024 * 128];
        int len = 0;
        while ((len = bis.read(bs)) != -1) {
            bos.write(bs,0,len);
        }
        //3.释放资源
        bos.close();
        bis.close();
    }
    /**
     * 复制文件:使用缓冲流 1312毫秒
     */
    public static void copy02() throws Exception {
        //1.创建两个流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\upload\\666.png"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.png"));
        //2.复制代码(一个一个字节慢慢复制)
        int b = 0;
        while ((b = bis.read()) != -1) {
            bos.write(b);
        }
        //3.释放资源
        bos.close();
        bis.close();
    }
    /**
     * 复制文件:使用普通流 222882毫秒
     */
    public static void copy01() throws Exception {
        //1.创建两个流
        FileInputStream fis = new FileInputStream("G:\\upload\\666.png");
        FileOutputStream fos = new FileOutputStream("copy.png");
        //2.复制(一个一个字节慢慢复制)
        int b = 0;
        while ((b = fis.read()) != -1) {
            fos.write(b);
        }
        //3.释放资源
        fos.close();
        fis.close();
    }
}
4.字符缓冲流的介绍和使用
  • a.字符缓冲流的构造

public BufferedWriter(Writer w);//创建字符的缓冲流需要传入普通的字符流
public BufferedReader(Reader r);//创建字符的缓冲流需要传入普通的字符流

  • b.字符缓冲流的2个特有方法

BufferedWriter 相比于 FileWriter 有一个特有方法:
public void newLine();//写入一个换行符

public class BufferedWriterDemo {
    public static void main(String[] args) throws IOException {
        //1.创建一个字符缓冲流
        FileWriter fw = new FileWriter("1.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        //2.研究bw的特有方法,newLine
        for (int i = 0; i < 10; i++) {
            bw.write("java");
            //使用newLine,写入一个跨平台的换行符
            bw.newLine();
        }
        //3.释放资源
        bw.close();
        fw.close();
    }
}

BufferedReader 相比于 FileReader 有一个特有方法:
public String readLine();

public class BufferedReaderDemo {
    public static void main(String[] args) throws IOException {
        //1.创建一个字符缓冲流
        FileReader fr = new FileReader("2.txt");
        BufferedReader br = new BufferedReader(fr);
        //2.读取数据
        //String line = br.readLine();
        //System.out.println(line);
        //=========一次读取一行的标准循环代码=========
        String line = "";
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        //3.释放资源
        br.close();
        fr.close();
    }
}
5.综合练习:文本排序

需求:
1.将文件中文本一行一行的读取出来
2.要求对每一行文本按照序号排序
3.将每一行写入到另外一个文件中,一行文本后面需要换行

public class BufferedTestDemo {
    public static void main(String[] args) throws Exception {
//        需求:
        ArrayList<String> arr = new ArrayList<String>();
//        1.将文件中文本一行一行的读取出来
        BufferedReader br = new BufferedReader(new FileReader("csb.txt"));
        String line = "";
        while ((line = br.readLine()) != null) {
            arr.add(line);
        }
        br.close();
//        2.要求对每一行文本按照序号排序
        Collections.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //按照首字母升序
                return o1.charAt(0) - o2.charAt(0);
            }
        });
//        3.将每一行写入到另外一个文件中,一行文本后面需要换行
        BufferedWriter bw = new BufferedWriter(new FileWriter("newcsb.txt"));
        for (String s : arr) {
            bw.write(s);
            bw.newLine();//换行
        }
        bw.close();
    }
}    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lemon20120331

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值