文档章节

Java IO类库之字节数组输入流ByteArrayInputStream

 老韭菜
发布于 07/21 17:57
字数 575
阅读 3
收藏 3

一、ByteArrayInputStream字节数组输入流介绍

    ByteArrayInputStream是字节数组输入流,继承自InputStream。它的内部包含一个缓冲区,是一个字节数组,缓冲数组用于保存从流中读取的字节数据,ByteArrayInputStream的内部定义了一个计数器pos,被用于定位read()方法要读取的下一个字节。

二、ByteArrayInputStream源码分析

1 - 成员变量

public
class ByteArrayInputStream extends InputStream {

    //内部缓冲数组,用于保存字节输入流数据
    protected byte buf[];

    //待读取字节的索引
    protected int pos;

    //字节输入流标记索引
    protected int mark = 0;

    //缓冲区有效字节数,等于缓冲区最后一个有效字节的下一个下标
    protected int count;

2、构造方法

    public ByteArrayInputStream(byte buf[]) {
        this.buf = buf;
        this.pos = 0;
        this.count = buf.length;
    }

    public ByteArrayInputStream(byte buf[], int offset, int length) {
        this.buf = buf;
        this.pos = offset;
        this.count = Math.min(offset + length, buf.length);
        this.mark = offset;
    }

ByteArrayInputStream有两个构造函数,ByteArrayInputStream(byte buf[])主要通过传入一个字节数组buf初始化ByteArrayInputStream的一些成员变量,生成一个字节数组输入流,ByteArrayInputStream(byte buf[], int offset, int length)通过传入offset和字节数组长度length初始化当前字节流,第二种构造函数还额外对读取起点做了标记,并提供标记回滚。

3 - 成员方法


    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
    }

    public synchronized int read(byte b[], int off, int len) {
        if (b == null) {
            throw new NullPointerException();
        } else if (off < 0 || len < 0 || len > b.length - off) {
            throw new IndexOutOfBoundsException();
        }

        if (pos >= count) {
            return -1;
        }

        int avail = count - pos;
        if (len > avail) {
            len = avail;
        }
        if (len <= 0) {
            return 0;
        }
        System.arraycopy(buf, pos, b, off, len);
        pos += len;
        return len;
    }

    public synchronized long skip(long n) {
        long k = count - pos;
        if (n < k) {
            k = n < 0 ? 0 : n;
        }

        pos += k;
        return k;
    }

    public synchronized int available() {
        return count - pos;
    }

    public boolean markSupported() {
        return true;
    }

    public void mark(int readAheadLimit) {
        mark = pos;
    }

    public synchronized void reset() {
        pos = mark;
    }

    public void close() throws IOException {
    }

ByteArrayInputStream字节数组输入流的各个成员方法逻辑非常简单,都是基于对内部缓冲数组buf以及数组中各种标记位pos、mark,count的操作实现的,这里就不再进行分析了。

 

© 著作权归作者所有

共有 人打赏支持
粉丝 11
博文 64
码字总数 107681
作品 0
杭州
后端工程师
JavaIO/输出输入入门

IO称之为输入输出,Java的IO是通过java.io包下的类和接口来支持,包含两大类:输入,输出. 在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Write...

Zhao-Qian
2013/01/04
0
0
Java I/O源码分析 - InputStream,OutputStream系列

说明 IntputStream,OutputStream 简介 助于理解 ByteArrayInputStream ByteArrayOutputStream PipedInputStream,PipedOutputStream PipedOutputStream FilterInputStream,FilterOutputStr......

HikariCP
09/29
0
0
Java IO : 流,以及适配器模式的应用

Java IO : 流,以及适配器模式的应用 适配器其实是分为对象适配器和类适配器两种,两种的工作原理不太一样。 对象适配器是使用组合的方法,在Adapter中会保留一个原对象(Adaptee)的引用,适...

秋风醉了
04/16
0
0
JAVA 字符流与字节流的区别

Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicod...

owensliu
2014/03/25
0
1
java I/O库中设计模式的应用

在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式。 在任何一种计算机语言中,输入/输出都是一个很重要的部分。与一般的计算机语言相比,java将输入/输出的功能和使用...

叶知秋
2013/06/06
0
2

没有更多内容

加载失败,请刷新页面

加载更多

vue组件传值之(父子)

⚠️组件的作用域是孤立的,vue解决组件传值问题是通过props ⚠️子传父的时候需要vm.$emit触发实例上的事件,页面需要定一个方法去取值 ⚠️一定要注意命名方式和书写,例如mylChart和myl-c...

peakedness丶
27分钟前
1
0
SpringBoot开发案例之整合Dubbo分布式服务

前言 在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了。在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使用的 ...

微笑向暖wx
41分钟前
1
0
TypeScript基础入门之装饰器(二)

转发 TypeScript基础入门之装饰器(二) 装饰器求值 如何应用装饰器应用于类内的各种声明的顺序: 1. 对每个实例成员应用参数装饰器,后跟Method,Accessor或Property Decorators。 2. 对每个静...

durban
41分钟前
1
0
Java程序员年薪40W是什么水平?税前还是税后?

很多人学Java都是冲着Java的高薪来的,那么搞Java的程序员,年薪40W到底是个什么水平呢,本文达妹和大家一起探讨一下。 前几天在论坛看到这么一个问题,搞Java的程序员年薪40w是什么水平?一...

架构师springboot
47分钟前
2
0
区块链100讲:盘点那些常用的加密算法原理

在开发过程中,常常用到各种加密方法和算法,本文总结了几种常用加密方法的原理。 1 对称加密 原理:加密和解密数据使用同一个密钥,适合对大量数据进行加解密 安全性:关键是密钥的保存方式...

HiBlock
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部