ByteArrayInputStream和ByteArrayOutputStream

Hermes深入理解及源码解析(二):Hermes的记忆机制 源码位置:tools/memory_tool.py存储内容为两个文件,放在 ~/.hermes/memories/:MEMORY.md:Agent 自己的笔记(环境事实、项目约定、工具坑、学到的东西)—— 上限 2200 字符USER.md:关于用户的画像(角色、偏好、沟通风格)—— 上限 1375 字符作为一个独立的工具注册在系统中(为了让智能体正确使用它,System Prompt()中明确下达了禁令存储目标存储位置数据类型持久偏好/事实MEMORY.md我是谁、我喜欢什么、环境配置。 阅读详情

1.ByteArrayInputStream和ByteArrayOutputStream简介

 ByteArrayInputStream是字节数组输入流,继承InputStream,它里面维护一个缓冲区,也就是一个byte类型的数组,通过一个计数器pos来实现对字节数组的读取。与之相对应的ByteArrayOutputStream是字节数组输出流,继承自OutputStream,它里面也维护一个缓冲区,通过一个计数器count来实现对字节数组的操作。具体实现如下

2.ByteArrayInputStream源码分析

package java.io;


public class ByteArrayInputStream extends InputStream {

    //字节缓冲区
    protected byte buf[];

    //当前读取字节的位置
    protected int pos;

    //标记字节的位置,如果没有标记,则为0
    protected int mark = 0;

    //记录字节数组的长度
    protected int count;

    //构造函数,初始化相关的参数
    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;
    }

    //返回当前pos位置上字节的值
    public synchronized int read() {
        //如果当前pos的位置的值超过了byte的最大的值,则和0xff与运算,获取正值
        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;
     //如果写入b的长度大于当前缓冲区的大小,则更新写入的长度为当前缓冲区的大小
        if (len > avail) {
            len = avail;
        }
        if (len <= 0) {
            return 0;
        }
    //调用native方法把当前缓冲区的内容复制到b中
        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 {
    }

}

3.ByteArrayOutputStream源码分析

package java.io;

import java.util.Arrays;


public class ByteArrayOutputStream extends OutputStream {

   //缓冲区
    protected byte buf[];

    //当前缓冲区存储字节的数量
    protected int count;

    //初始化默认的字节流的缓冲大小为32
    public ByteArrayOutputStream() {
        this(32);
    }

   //初始化制定大小的字节流缓冲
    public ByteArrayOutputStream(int size) {
        if (size < 0) {
            throw new IllegalArgumentException("Negative initial size: "
                                               + size);
        }
        buf = new byte[size];
    }

    //对字节流的缓冲扩容
    private void ensureCapacity(int minCapacity) {
        // overflow-conscious code
    //如果当前缓冲区的大小不能继续存放字节,则扩容

        if (minCapacity - buf.length > 0)
            grow(minCapacity);
    }

   //字节流缓冲扩容
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = buf.length;
        int newCapacity = oldCapacity << 1;
        //最小扩容为原来的一倍
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity < 0) {//超过Integer的大小,则变为负数
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            newCapacity = Integer.MAX_VALUE;
        }
        buf = Arrays.copyOf(buf, newCapacity);
    }

    //写入一个字节到字节流数组
    public synchronized void write(int b) {
        ensureCapacity(count + 1);
        buf[count] = (byte) b;
        count += 1;
    }

   //把传入的字节数组b从off开始写入len的长度到当前字节流数组
    public synchronized void write(byte b[], int off, int len) {
        if ((off < 0) || (off > b.length) || (len < 0) ||
            ((off + len) - b.length > 0)) {
            throw new IndexOutOfBoundsException();
        }
        ensureCapacity(count + len);
        System.arraycopy(b, off, buf, count, len);
        count += len;
    }

    //把一个outputStream中存储的数据写入到当前字节流数组
    public synchronized void writeTo(OutputStream out) throws IOException {
        out.write(buf, 0, count);
    }

   //重置字节流数组的读取的位置为0
    public synchronized void reset() {
        count = 0;
    }

    //把字节流转换成字节数组
    public synchronized byte toByteArray()[] {
        return Arrays.copyOf(buf, count);
    }

    //返回当前字节流数组读取的位置
    public synchronized int size() {
        return count;
    }

    //根据默认的字节编码来把字节流转换成string
    public synchronized String toString() {
        return new String(buf, 0, count);
    }

   //根据制定的编码类型转换成字符串
    public synchronized String toString(String charsetName)
        throws UnsupportedEncodingException
    {
        return new String(buf, 0, count, charsetName);
    }

   
    @Deprecated
    public synchronized String toString(int hibyte) {
        return new String(buf, hibyte, 0 count);
    }

    //因为在内存中操作,所以不需要关闭流
    public void close() throws IOException {
    }

}

4.示例代码

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

public class ByteTest {

    private static final String STRING1 = "成功后,进一步的元素处理被抑制,并且搜索功能的任何其他并行调用的结果被忽略。";

    public static void main(String[] args) {
        try {
            ByteArrayInputStream bis = new ByteArrayInputStream(STRING1.getBytes());

            byte[] buffer = new byte[STRING1.getBytes().length];
            byte[] bytes = new byte[1024];
            int count;
            int readCount=0;

            while((count=bis.read(bytes)) > 0)
            {
                System.arraycopy(bytes, 0, buffer, readCount, count);
                readCount += count;
            }
            System.out.println(new String(buffer,"utf-8"));

            System.out.println("============================");

            ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);

            byte[] buffer2 = STRING1.getBytes();

            bos.write(buffer2,0,buffer2.length);

            //System.out.println(bos.toString("utf-8"));
            System.out.println(new String(bos.toByteArray(),"utf-8"));

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}
成功后,进一步的元素处理被抑制,并且搜索功能的任何其他并行调用的结果被忽略。
============================
成功后,进一步的元素处理被抑制,并且搜索功能的任何其他并行调用的结果被忽略。




差分运放电路输出电压偏置设计解析 差分运算放大电路是信号处理中的基础模块,通过差分对管结构实现共模抑制与差模放大。其核心原理基于运放的虚短虚断特性,当电阻网络满足对称条件时,输出电压与输入差分成正比。在工业测量系统中,由于ADC通常仅支持正电压输入,需要通过偏置电路将双极性信号平移至正电压范围。典型设计采用精密基准电压源和匹配电阻网络,既保持信号完整性又满足系统接口要求。本文以-100V高压测量为例,详细解析了分压网络设计、参考电压选取以及电阻匹配等关键技术要点,为传感器接口电路设计提供实践参考。 阅读详情

相关推荐

YOLOv8缺陷检测可视化界面实战:PyQt5布局设计与代码实现

本文详细介绍了如何利用PyQt5为YOLOv8缺陷检测模型构建一个专业、易用的可视化界面。通过实战讲解PyQt5的布局管理器设计、信号槽机制与YOLOv8核心的集成,帮助开发者快速将AI模型部署为直观的桌面应用,提升工业质检等场景的落地效率。

redis7keeper的博客 758

ByteArrayOutputStream详解

介绍: ByteArrayOutputStream 对byte类型数据进行写入的类 相当于一个中间缓冲层,将类写入到文件等其他outputStream。它是对字节进行操作,属于内存操作流 源码解析: public class ByteArrayOutputStream extends OutputStream { } 从上述代码中可以看出ByteArrayOutputStream继承了Out...

WeiLGHui 6万+

TMS320F280049C 学习笔记4 Led_ex1_blinky 初始化函数及系统时钟

承接上一篇学习笔记,这次开始实际运行例程。本文概述了280049C的第一个实验 Led灯闪烁。同时也总结了系统的初始化函数和时钟配置。

whyorwhnt的专栏 7029

Java I/O(三)文件I/O

Java文件I/O 字节流 字符流 输入流 输出流

yunyun1886358的专栏 2万+

【目标检测】yoloV5算法详解

一、与yoloV4相比,yoloV5的改进 输入端:在模型训练阶段,使用了Mosaic数据增强、自适应锚框计算、自适应图片缩放 基准网络:使用了FOCUS结构和CSP结构 Neck网络:在Backbone和最后的Head输出层之间插入FPN_PAN结构 Head输出层:训练时的损失函数GIOU_Loss,预测筛选框的DIOU_nns 二、yoloV5结构框架 CBL:CBL模块是由Conv+BN+Leaky_relu激活函数组成 Res unit:借鉴ResNet中的残差结构,用来构建深层网络,CBM是

qq_40373651的博客 2万+

文献解读:结构方程模型SEM基础,小白看这个就基本够了

今天要解读的依然是一篇教学文献:The Basics of Structural Equation Modeling,文献作者是Diana Suhr, Ph.D. University of Northern Colorado。 文献链接: https://www.lexjansen.com/wuss/2006/tutorials/TUT-Suhr.pdf 结构方程模型是: 用来检验显变量与潜变量关系假设的综合性的统计技巧 用来表示,估计或者检验变量间理论关系的技巧 用来探究一系列潜变量和显变量因

Codewar的博客 6万+

Java自学日记之IO流(四):字节数组流(ByteArrayInputStream、ByteArrayOutputStream)

系列文章目录 Java自学日记之IO流(一):字节流和字符流 Java自学日记之IO流(二):转换流(InputStreamReader、OutputStreamWriter) Java自学日记之IO流(三):缓冲流(BufferedInputStream、BufferedOutputStream) 文章目录系列文章目录前言一、字节数组流介绍1.字节数组流作用2.ByteArrayInputStream介绍3.ByteArrayOutputStream介绍二、构造方法1.ByteArrayInputStr

qq_51738873的博客 1万+

【PostgreSQL教程】PostgreSQL 高级篇之子查询

子查询也可称为内部查询、嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句。一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,并可使用运算符如 =、、>=、

No8g攻城狮的博客 1206

SharedByteArrayInputStream 本不该出现的异常

近日在用 JavaMail 编写发送 E-mail 的应用,在一段十分普通的 Java 代码中出现了如下的一段异常:DEBUG: setDebug: JavaMail version 1.3.2Exception in thread "Main Thread" java.lang.NoClassDefFoundError: com/sun/mail/util/SharedByteArrayInpu

Change is Constant 9756

Cadence OrCAD Capture 软件自带元件原理图符号库目录与介绍图文视频教程

硬件工程师在开始原理图设计时,应该首先拥有自己的元件原理图符号库。基于Capture进行原理图设计的一个很大的优点就是,软件自带的元件库比较全。本文简单介绍Capture软件自带元件库。

fydar的博客 5579

【FPGA教程案例89】编译码2——使用vivado核实现RS信道编译码

RS编码,又称里所码,即Reed-solomon codes,是一种前向纠错的信道编码,对由校正过采样数据所产生的多项式有效。当接收器正确的收到足够的点后,它就可以恢复原来的多项式,即使接收到的多项式上有很多点被噪声干扰失真。

FPGA/MATLAB学习教程/源码/项目合作开发 3541

java.lang.ClassCastException: javax.mail.util.SharedByteArrayInputStream

最近在做用javamail解析邮件的项目,在解析邮件时一直报:java.lang.ClassCastException: javax.mail.util.SharedByteArrayInputStream 在百度上找了好久也没有解决办法,最后通过google在一英文网站上找到解决办法(再次事实证明,Google才是王道) 参考网址:https://java.net/projects/java

zhubo0228的专栏 1万+

光通量与辐射通量之间的换算

由理论和实验可知存在两种定义: 1W1W1W(瓦特)的频率为540×1012Hz540\times10^{12}Hz540×1012Hz(赫兹)的单色辐射的辐射通量等于683lm(流明)683lm(流明)683lm(流明).。 1lm1lm1lm的频率为540×1012Hz540\times10^{12}Hz540×1012Hz的单色通量等于1683=0.001464W\frac{1}{683}=0.001464W6831​=0.001464W。 从上述定义中我们可以得到什么呢?我们知道光速: c=3×

u011699626的博客 3271

ByteArrayOutputStream和ByteArrayInputStream详解

ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。具体用法如下:

anzhu_111的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ByteArrayOutputStream和ByteArrayInputStream

http://blog.youkuaiyun.com/rcoder/article/details/6118313 http://bbs.phpchina.com/blog-24549-142721.html 第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的

每天问问自己,你今天努力了吗? 1309

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java中ByteArrayInputStream和ByteArrayOutputStream用法详解

ByteArrayInputStream 是字节数组输入流。它继承于 InputStream。InputStream 通过。

qq_43842093的博客 5264

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JAVA中ByteArrayInputStream和ByteArrayOutputStream详解

1.ByteArrayInputStream ByteArrayInputStream中包含一个内部缓冲区,用来包含那些可能从流中读的字节数组。还有一个内部计数器来跟踪下一个将被读取的字节。ByteArrayInputStream只能用字节数组来进行构造。主要包括的方法有和InputStream类似,请点击这里,只是重写了抽象方法。 下面是一段测试代码: import java.io.ByteArrayInputStream; import java.io.IOException; import java.

weixin_43360488的博客 1317

ByteArrayInputStream和ByteArrayOutputStream的使用

ByteArrayInputStream需要绑定数据源 ByteArrayInputStream bais=new ByteArrayInputStream(fileByteArray);//fileByteArray为字节数组 ByteArrayOutputStream则不需要绑定数据输出目标: ByteArrayOutputStream baos= new ByteArrayOutp...

weixin_43317111的博客 953

对ByteArrayOutputStream和ByteArrayInputStream的应用

/**  * 要求:对ByteArrayOutputStream和ByteArrayInputStream的应用  */ import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class ByteArrayInputOut

zhyzh134的博客 571

ByteArrayOutputStream和ByteArrayInputStream的作用

字节数组流: ByteArrayOutputStream:    可以捕获内存缓冲区的数据,转换成字节数组。 ByteArrayoutputStream bout=new ByteArrayOutputStream(); bout.write(int a);  bout.write(int b);  bout.write(int c); byte[] buf=bout.toByteArra

sinat_30474567的博客 1439

java中ByteArrayInputStream和ByteArrayOutputStream类用法

ByteArrayInputStream和ByteArrayOutputStream,用于以IO流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映射文件的功能 实例: import java.io.*; public class ByteArrayStreamTest { public static void main(String [] args) { St

RO_wsy的专栏 6283

ByteArrayOutputStream和ByteArrayInputStream的简单使用

@ByteArrayOutputStream和ByteArrayInputStream的简单使用 1.首先看下这两个IO流是什么? ByteArrayOutputStream:字节数组输出流.在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。 ByteArrayInputStream:字节数组输入流.在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓...

Colourful.的博客 420
上一篇: idea java ssm+maven 项目创建
下一篇: ConcurrentHashMap原理分析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值