• IO流框架,缓冲流


    一.缓冲流有什么优点

    Java中的缓冲流(Buffered Stream)具有以下优势:

    1. 提高效率:缓冲流通过在内存中缓存一部分数据,减少了直接从内存到磁盘或从磁盘到内存的频繁IO操作,从而提高了读写效率。
    2. 缓冲区大小调整:缓冲流可以自动调整缓冲区的大小,以适应不同大小的写入或读取操作。这有助于提高内存的使用效率,并减少因频繁分配和释放内存导致的系统开销。
    3. 自动刷新:当缓冲区满时,缓冲流会自动刷新将数据写入目标位置。这有助于减少程序员需要手动刷新流的次数,降低出错风险。
    4. 错误处理:缓冲流提供了检查写入或读取操作是否发生错误的方法。这使得程序员可以更好地处理流操作中的错误情况。
    5. 自动关闭:Java 7引入的try-with-resources语句可以自动关闭实现了AutoCloseable接口的资源,包括缓冲流。这有助于确保流在使用完毕后被正确关闭,避免资源泄漏问题。

    总之,缓冲流通过缓存、自动调整、错误处理和自动关闭等功能,提高了流操作的效率、可靠性和安全性。

    二.字节缓冲流

    1.原理

    原理:字节缓冲输入流自带8kb缓冲池,字节缓冲输出流也自带8kb缓冲池

     2.构造器

    public BufferedInputstream(InputStream is)
    把低级的字节输入流包装成一个高级的缓冲字节输入流,从而提高读数据的性能


    public BufferedOutputStream(OutputStream os
    把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能

    3.代码

    1. package org.example;
    2. import java.io.*;
    3. public class day09 {
    4. public static void main(String[] args) {
    5. try (InputStream is = new FileInputStream("d:/temp/day05/改名.mp4");
    6. //定义一个字节缓冲输入流包装原始的字节输入流
    7. BufferedInputStream bis = new BufferedInputStream(is);
    8. OutputStream os = new FileOutputStream("d:/temp/day05/新名.mp4");
    9. //定义一个字节缓冲输出流包装原始的字节输出流
    10. BufferedOutputStream bos = new BufferedOutputStream(os)
    11. ) {
    12. byte[] buffer = new byte[1024];
    13. int len;
    14. while((len = bis.read(buffer)) != -1){
    15. bos.write(buffer,0,len);
    16. }
    17. System.out.println("完成");
    18. } catch (Exception e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. }

    默认缓冲池8kb,如果需要缓冲池更大,可以更改:

    InputStream is = new FileInputStream("d:/temp/day05/改名.mp4");
    //定义一个字节缓冲输入流包装原始的字节输入流
    BufferedInputStream bis = new BufferedInputStream(is,8192*3);

    OutputStream os = new FileOutputStream("d:/temp/day05/新名.mp4");
    //定义一个字节缓冲输出流包装原始的字节输出流
    BufferedOutputStream bos = new BufferedOutputStream(os,8192*3)

    三.字符缓冲流

    1.字符缓冲输入流

    自带8kb的字符缓冲池,可以提高字符输入流读取字符数据的性能

    2.构造器

    public BufferedReader(Reader r)
    把低级的字符输入流包装成字符缓冲输入流管道,从而提高字符输入流读字符数据的性能

    3.方法

    public String readLine()
    读取一行数据返回,如果没有数据可读了,会返回nul1

    4.代码

    1. package org.example;
    2. import java.io.*;
    3. import java.lang.invoke.VarHandle;
    4. public class day10 {
    5. public static void main(String[] args) {
    6. try (Reader fr = new FileReader("d:/temp/day05/完美世界.txt");
    7. BufferedReader buf = new BufferedReader(fr);
    8. ) {
    9. char[] chars = new char[5];
    10. int len;
    11. while((len =buf.read(chars))!=-1){
    12. System.out.print(new String(chars,0,len));
    13. }
    14. } catch (Exception e) {
    15. e.printStackTrace();
    16. }
    17. }
    18. }

    按行读取

    1. package org.example;
    2. import java.io.*;
    3. import java.lang.invoke.VarHandle;
    4. public class day10 {
    5. public static void main(String[] args) {
    6. try (Reader fr = new FileReader("d:/temp/day05/完美世界.txt");
    7. BufferedReader buf = new BufferedReader(fr);
    8. ) {
    9. String s;
    10. while((s = buf.readLine())!=null){
    11. System.out.println(s);
    12. }
    13. } catch (Exception e) {
    14. e.printStackTrace();
    15. }
    16. }
    17. }

    5.字符缓冲输出流

    自带8kb的字符缓冲池,可以提高字符输出流写字符数据的性能

    6.构造器

    public BufferedWriter(Writer r)
    把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能

    7.代码

    1. package org.example;
    2. import java.io.BufferedWriter;
    3. import java.io.FileWriter;
    4. import java.io.Writer;
    5. public class day11 {
    6. public static void main(String[] args) {
    7. try ( //用多态
    8. Writer fw = new FileWriter("d:/temp/day05/test1.txt",true);
    9. //创建字符缓冲输出流管道包装原始的字符输出流
    10. final BufferedWriter bfw = new BufferedWriter(fw);
    11. ){
    12. bfw.write("大梦谁先醒");
    13. bfw.newLine();//换行符
    14. bfw.write("我计不成,乃天命也");
    15. } catch (Exception e) {
    16. e.printStackTrace();
    17. }
    18. }
    19. }

  • 相关阅读:
    计算机视觉40例之案例03数字水印
    探索控制领域:从电视遥控器到自动驾驶【基础概念理解、应用实例】
    Electron 学习
    MySQL recursive 递归
    linux查询java进程的指令,查询内存的指令
    <C++> STL_bitset使用和模拟实现
    前端与HTML
    SHELL中的数组及其相关操作
    ios开发App,在App Store上架的app更新提交过程
    Jmeter常用参数化技巧总结
  • 原文地址:https://blog.csdn.net/qq_45663499/article/details/134096413