ByteArrayInputStream 类详解

ByteArrayInputStream 类详解

ByteArrayInputStream 是 Java 中用于从字节数组读取数据的输入流,位于 java.io 包。它允许将内存中的字节数组当作输入流来读取,是处理内存数据的常用工具。


1. 核心特性

  • 内存数据源:从字节数组(byte[])读取数据
  • 无需关闭close() 方法为空操作(无系统资源需要释放)
  • 线程不安全:多线程访问需外部同步
  • 支持标记/重置:可重复读取数据(mark()reset()

2. 类继承关系

InputStream
ByteArrayInputStream

3. 构造方法

构造方法说明
ByteArrayInputStream(byte[] buf)使用整个字节数组作为数据源
ByteArrayInputStream(byte[] buf, int offset, int length)使用数组的指定区间

4. 核心方法

(1)读取数据

方法说明
int read()读取单个字节(返回0-255,-1表示结束)
int read(byte[] b, int off, int len)读取数据到字节数组
long skip(long n)跳过指定字节数

示例

byte[] data = {72, 101, 108, 108, 111}; // "Hello"的ASCII码
ByteArrayInputStream bais = new ByteArrayInputStream(data);int byteRead;
while ((byteRead = bais.read()) != -1) {System.out.print((char) byteRead); // 输出: Hello
}

(2)流控制

方法说明
int available()返回剩余可读字节数
void mark(int readlimit)标记当前位置(readlimit 参数被忽略)
void reset()重置到标记位置(默认是起始位置)
boolean markSupported()始终返回 true(支持标记)

标记/重置示例

bais.mark(0); // 标记起始位置
System.out.print((char) bais.read()); // 读取'H'
bais.reset();  // 重置回起始位置
System.out.print((char) bais.read()); // 再次读取'H'

5. 使用场景

(1)内存数据处理

byte[] pdfData = generatePdf();
try (ByteArrayInputStream bais = new ByteArrayInputStream(pdfData);PDFParser parser = new PDFParser(bais)) {// 解析PDF数据
}

(2)单元测试模拟输入

// 模拟用户输入
String input = "test\n123\n";
ByteArrayInputStream testInput = new ByteArrayInputStream(input.getBytes());
System.setIn(testInput); // 重定向System.inScanner scanner = new Scanner(System.in);
System.out.println(scanner.nextLine()); // 输出: test

(3)与其他流配合

byte[] compressedData = getGzipData();
try (ByteArrayInputStream bais = new ByteArrayInputStream(compressedData);GZIPInputStream gzis = new GZIPInputStream(bais)) {// 解压数据
}

6. 性能优化

(1)批量读取

byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bais.read(buffer)) != -1) {process(buffer, 0, bytesRead);
}

(2)避免频繁创建

// 复用ByteArrayInputStream(调用reset()后重新读取)
bais.reset(); 

7. 与 ByteArrayOutputStream 对比

特性ByteArrayInputStreamByteArrayOutputStream
方向读取数据写入数据
数据源已有字节数组动态增长缓冲区
关闭需求非必需非必需
典型用途解析内存数据收集输出数据

8. 常见问题

(1)数组越界

  • 错误示例
    byte[] smallArray = new byte[10];
    ByteArrayInputStream bais = new ByteArrayInputStream(smallArray, 5, 10); // 抛出IndexOutOfBoundsException
    
  • 解决:确保 offset + length ≤ buf.length

(2)编码转换

  • 正确方式
    byte[] utf8Bytes = "中文".getBytes("UTF-8");
    ByteArrayInputStream bais = new ByteArrayInputStream(utf8Bytes);
    String text = new String(toByteArray(bais), "UTF-8");
    

9. 实战案例

(1)Base64 解码

String base64 = "SGVsbG8="; // "Hello"的Base64编码
byte[] decoded = Base64.getDecoder().decode(base64);
ByteArrayInputStream bais = new ByteArrayInputStream(decoded);
// 使用解码后的数据...

(2)图像处理

byte[] imageData = getImageBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
BufferedImage image = ImageIO.read(bais);

10. 总结

  • 适用场景:内存数据解析、测试数据模拟、与其他流配合
  • 优势:无需物理I/O,轻量高效
  • 注意:大数据量需考虑内存限制

扩展练习

  1. 实现一个方法,将 ByteArrayInputStream 内容复制到 ByteArrayOutputStream
  2. 结合 DataInputStream 读取结构化二进制数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rvalue引用()

一、先确定基础:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明确内存地址的表达式,可以取地址。比如变量名、引用等。 复制代码 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吴恩达深度学习作业 RNN模型——字母级语言模型

一. 简单复习一下RNN RNN RNN适用于处理序列数据,令是序列的第i个元素,那么就是一个长度为的序列,NLP中最常见的元素是单词,对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时,为了表示序列的…

基于python的哈希查表搜索特定文件

Python有hashlib库,支持多种哈希算法,比如MD5、SHA1、SHA256等。通常SHA256比较安全,但MD5更快,但可能存在碰撞风险,得根据自己需求决定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…

idea创建springboot项目无法创建jdk8原因及多种解决方案

idea创建springboot项目无法创建jdk8原因及多种解决方案 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】&#x…

【C++进阶十】多态深度剖析

【C进阶十】多态深度剖析 1.多态的概念及条件2.虚函数的重写3.重写、重定义、重载区别4.C11新增的override 和final5.抽象类6.虚表指针和虚表6.1什么是虚表指针6.2指向谁调用谁,传父类调用父类,传子类调用子类 7.多态的原理8.单继承的虚表状态9.多继承的…

面向网络安全的开源 大模型-Foundation-Sec-8B

1. Foundation-Sec-8B 整体介绍 Foundation-Sec-8B 是一个专注于网络安全领域的大型语言模型 (LLM),由思科的基础人工智能团队 (Foundation AI) 开发 。它基于 Llama 3.1-8B 架构构建,并通过在一个精心策划和整理的网络安全专业语料库上进行持续预训练而得到增强 。该模型旨在…

Python爬虫的基础用法

Python爬虫的基础用法 python爬虫一般通过第三方库进行完成 导入第三方库(如import requests ) requests用于处理http协议请求的第三方库,用python解释器中查看是否有这个库,没有点击安装获取网站url(url一定要解析正确&#xf…

WHAT - Tailwind CSS + Antd = MetisUI组件库

文章目录 Tailwind 和 Antd 组件库MetisUI 组件库 Tailwind 和 Antd 组件库 在 WHAT - Tailwind 样式方案(不写任何自定义样式) 中我们介绍了 Tailwind,至于 Antd 组件库,我们应该都耳熟能详,官网地址:htt…

Day 4:牛客周赛Round 91

好久没写了,问题还蛮多的。听说这次是苯环哥哥出题 F题 小苯的因子查询 思路 考虑求因子个数,用质因数分解;奇数因子只需要去掉质数为2的情况,用除法。 这里有个比较妙的细节是,提前处理出数字x的最小质因数&#xff0…

使用直觉理解不等式

问题是这个: 题目 探究 ∣ max ⁡ b { q 1 ( z , b ) } − max ⁡ b { q 2 ( z , b ) } ∣ ≤ max ⁡ b ∣ q 1 ( z , b ) − q 2 ( z , b ) ∣ |\max_b\{q_1(z,b)\}-\max_b\{q_2(z,b)\}|\le\max_b|q_1(z,b)-q_2(z,b)| ∣maxb​{q1​(z,b)}−maxb​{q2​(z,b)}∣≤…

恶心的win11更新DIY 设置win11更新为100年

‌打开注册表编辑器‌:按下Win R键,输入regedit,然后按回车打开注册表编辑器。‌12‌导航到指定路径‌:在注册表编辑器中,依次展开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings‌新建DWORD值‌&…

嵌入式驱动学习

时钟 定义 周期型的0、1信号 时钟信号由“心脏”时钟源产生,通过“动脉”时钟树传播到整个芯片中。 SYSCLK系统时钟,由HSI、HSE、PLLCLK三选一。 HCLK是AHB总线时钟, PCLK是APB总线时钟。 使用某个外设,必须要先使能该外设时钟系统…

Java:从入门到精通,你的编程之旅

Java,一门历久弥新的编程语言,自诞生以来就以其跨平台性、面向对象、稳定性和安全性等特性,在企业级应用开发领域占据着举足轻重的地位。无论你是初学者还是经验丰富的开发者,Java 都能为你提供强大的工具和广阔的舞台。 为什么选…

Linux:深入理解数据链路层

实际上一台主机中,报文并没有通过网络层直接发送出去,而是交给了自己的下一层协议——数据链路层!! 一、理解数据链路层 网络层交付给链路层之前,会先做决策再行动(会先查一下路由表,看看目标网…

Python基本语法(类和实例)

类和实例 类和对象是面向对象编程的两个主要方面。类创建一个新类型,而对象是这个 类的实例,类使用class关键字创建。类的域和方法被列在一个缩进块中,一般函数 也可以被叫作方法。 (1)类的变量:甴一个类…

2025 年如何使用 Pycharm、Vscode 进行树莓派 Respberry Pi Pico 编程开发详细教程(更新中)

micropython 概述 micropython 官方网站:https://www.micropython.org/ 安装 Micropython 支持固件 树莓派 Pico 安装 Micropython 支持固件 下载地址:https://www.raspberrypi.com/documentation/microcontrollers/ 选择 MicroPython 下载 RPI_PIC…

flink rocksdb状态说明

文章目录 1.默认情况2.flink中的状态3.RocksDB4.对比情况5.使用6.RocksDB架构7.参考文章8.总结提示:以下主要考虑flink 状态永久存储 rocksdb情况,做一些简单说明 1.默认情况 当flink使用rocksdb存储状态时。无论是永久存储还是临时存储都可能会落盘写文件(如果没有配置存储…

安装SDL和FFmpeg

1、先记录SDL 这玩意还是有一点讲究的 具体步骤: 下载 SDL包: 链接:https://www.libsdl.org/release/SDL2-2.0.14.tar.gz 可以用迅雷,下载完之后, 解压: tar -zxvf SDL2-2.0.14.tar.gz进入安装目录 cd …

2022年408真题及答案

2022年计算机408真题 2022年计算机408答案 2022 408真题下载链接 2022 408答案下载链接

Spring AI聊天模型API:轻松构建智能聊天交互

Spring AI聊天模型API:轻松构建智能聊天交互 前言 在当今数字化时代,智能聊天功能已成为众多应用程序提升用户体验、增强交互性的关键要素。Spring AI的聊天模型API为开发者提供了一条便捷通道,能够将强大的AI驱动的聊天完成功能无缝集成到…