JavaDriver JavaDriver
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YoungAnn

西二旗Java老司机一枚 致力于社会主义添砖Java
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础

    • Java 异常有哪些类型?
    • HashMap 与 ConcurrentHashMap 的实现原理是怎样的?
    • Java 中接口和抽象类的区别
    • 为什么重写 equals 必须重写 hashcode ?
    • == 和 equals() 的区别?
    • String,StringBuffer,StringBuilder 之间有什么区别?
    • 简述 ArrayList 与 LinkedList 的底层实现以及常见操作的时间复杂度
    • 简述 BIO, NIO, AIO 的区别
    • 在一个静态方法内调用一个非静态成员为什么是非法的?
    • 简述 Java 的反射机制及其应用场景
    • Java 类的加载流程是怎样的?
    • 什么是双亲委派机制?
    • Java 中 sleep() 与 wait() 的区别
    • 简述 Java 中 final 关键字的作用
    • String 类能不能被继承?为什么?
    • Java 缓冲流 buffer 的用途和原理是什么?
      • Java 缓冲流 buffer 的用途和原理是什么?
    • 简述动态代理与静态代理
    • 阻塞队列都有哪几种,有什么区别?
    • 简述 HashSet 实现原理
  • 并发

  • JVM

  • 设计模式

  • Java相关
  • 基础
YoungAnn
2022-04-04
目录

Java 缓冲流 buffer 的用途和原理是什么?

# Java 缓冲流 buffer 的用途和原理是什么?

buffer本质是一个字节数组(ByteBuff),同时提供数据的结构化访问以及维护读写位置。
而运用BufferedInputStream,则可以一次性读n个字节到内存中的缓冲区,这样在内存中读取数据会快很多。 1.流是单向的 所以会有输入流、输出流
2.字节流一般用于处理文件、视频、音频等,字符流一般用于处理文本数据。
3.原理:维护一个数组、一个指针

public class BufferedInputStream extends FilterInputStream{
    private static int DEFAULT_BUFFER_SIZE = 8192;
    private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
    // 缓冲数组
    protected volatile byte buf[];
    // bufUpdater提供buf的compareAndSet方法,这是必要的,因为close()可以是异步的,可以将buf是否为null作为是否close的主要指标。
    private static final AtomicReferenceFieldUpdater<BufferedInputStream, byte[]> bufUpdater =
        AtomicReferenceFieldUpdater.newUpdater(BufferedInputStream.class,  byte[].class, "buf");
    // buf中的有效字节数
    protected int count;
    // buf中的当前字节位置
    protected int pos;
    
    public BufferedInputStream(InputStream in) {
        this(in, DEFAULT_BUFFER_SIZE);
    }

    public BufferedInputStream(InputStream in, int size) {
        super(in);
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }

   //读方法 -> 数据写入到数组buf中
    public synchronized int read() throws IOException {
        // 当读完buf中的数据后,就需要把InputStream的数据重新填充到buf
        if (pos >= count) {
            fill();
            if (pos >= count)
                return -1;
        }
        // 返回buf的下一个字节 指针后移
        return getBufIfOpen()[pos++] & 0xff;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
编辑 (opens new window)
上次更新: 2022/05/19, 21:26:01
String 类能不能被继承?为什么?
简述动态代理与静态代理

← String 类能不能被继承?为什么? 简述动态代理与静态代理→

最近更新
01
电商-商品系统设计
12-17
02
关于如何写OKR
12-09
03
对事不对人 vs 对人不对事
12-09
更多文章>
Theme by Vdoing | Copyright © 2022-2023 YoungAnnn | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式