当前位置: 首页 > article >正文

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.代码

package org.example;

import java.io.*;

public class day09 {
    public static void main(String[] args) {
        try (InputStream is = new FileInputStream("d:/temp/day05/改名.mp4");
             //定义一个字节缓冲输入流包装原始的字节输入流
             BufferedInputStream bis = new BufferedInputStream(is);

             OutputStream os = new FileOutputStream("d:/temp/day05/新名.mp4");
             //定义一个字节缓冲输出流包装原始的字节输出流
             BufferedOutputStream bos = new BufferedOutputStream(os)
        ) {
             byte[] buffer = new byte[1024];
             int len;
             while((len = bis.read(buffer)) != -1){
                 bos.write(buffer,0,len);
             }
            System.out.println("完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

默认缓冲池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.代码

package org.example;

import java.io.*;
import java.lang.invoke.VarHandle;

public class day10 {
    public static void main(String[] args) {
        try (Reader fr = new FileReader("d:/temp/day05/完美世界.txt");
             BufferedReader buf = new BufferedReader(fr);
        ) {
            char[] chars = new char[5];
            int len;
            while((len =buf.read(chars))!=-1){
                System.out.print(new String(chars,0,len));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

按行读取

package org.example;

import java.io.*;
import java.lang.invoke.VarHandle;

public class day10 {
    public static void main(String[] args) {
        try (Reader fr = new FileReader("d:/temp/day05/完美世界.txt");
             BufferedReader buf = new BufferedReader(fr);
        ) {
            String s;
            while((s = buf.readLine())!=null){
                System.out.println(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5.字符缓冲输出流

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

6.构造器

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

7.代码

package org.example;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.Writer;

public class day11 {
    public static void main(String[] args) {
        try ( //用多态
              Writer fw = new FileWriter("d:/temp/day05/test1.txt",true);
              //创建字符缓冲输出流管道包装原始的字符输出流
              final BufferedWriter bfw = new BufferedWriter(fw);
        ){
            bfw.write("大梦谁先醒");
            bfw.newLine();//换行符
            bfw.write("我计不成,乃天命也");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


http://www.kler.cn/a/107794.html

相关文章:

  • DOCKER 镜像基础命令
  • opencv常用api
  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系
  • DevOps工程技术价值流:加速业务价值流的落地实践与深度赋能
  • Java的dto,和多表的调用
  • 【Codeforces】 CF79D Password
  • CompletableFuture 实战
  • 公网远程访问macOS本地web服务器
  • 23种设计模式(10)——门面模式
  • css:如何通过不同的值,改变盒子的样式和字体颜色通过computed而不是v-if
  • Operator开发之operator-sdk入门
  • XMLHttpRequest拦截请求和响应
  • Unity性能优化一本通
  • YOLOv5 onnx \tensorrt 推理
  • uniapp接口请求api封装,规范化调用
  • Go 实现插入排序算法及优化
  • 软考系列(系统架构师)- 2013年系统架构师软考案例分析考点
  • 5月22日比特币披萨日,今天你吃披萨了吗?
  • 【计算机网络】认识协议
  • Spring Boot拓展XML格式的请求和响应
  • 『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程
  • leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间
  • Linux:【1】Linux中的文件权限概念和相关命令
  • Hive 视图和索引
  • Spring Security—配置(Configuration)