【Java I/O 流】字节数组流:ByteArrayInputStream 和 ByteArrayOutputStream

简介: 今天的主题是字节数组流,即`ByteArrayInputStream` 和 `ByteArrayOutputStream`。这两个流主要用于字节数组与流之前的转换。

在这里插入图片描述

❤️ 个人主页: 水滴技术
🚀 支持水滴: 点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏: Java 教程:从入门到精通

大家好,我是水滴~~

今天的主题是字节数组流,即ByteArrayInputStreamByteArrayOutputStream。这两个流主要用于字节数组与流之前的转换。

本文将通过“内部字段、构造函数、常用方法、代码案例”的方式来介绍这两个类,赶紧开始吧。

ByteArrayInputStream(字节数组输入流)

ByteArrayInputStream 会在内存中创建一个字节数组缓冲区,从流中读取的字节会保存在该缓冲区中,内部计数器跟踪读取方法提供的下一个字节。

内部字段

byte[] buf

由流的创建者提供的字节数组。

int pos

要从输入流缓冲区中读取的下一个字节的索引。

int count

流中缓冲区的有效字节数。

int mark

流中当前标记的位置。

构造函数

创建该字节数组输入流有两种方式。

ByteArrayInputStream(byte buf[])

通过字节数组 buf 创建一个 ByteArrayInputStream 实例,该字节数组不会被复制,而是直接作为它的缓冲区数组。 pos 的初始值为0, count 的初始值为 buf 的长度。

ByteArrayInputStream(byte buf[], int offset, int length)

通过字节数组 buf 创建一个 ByteArrayInputStream 实例,使用 buf 作为缓冲区数组。 pos 的初始值为 offsetcount 的初始值为 “ offset + length ”和 “ buf.length” 的最小值。而 mark初始值为 offset

常用方法

该类的常用方法与前面介绍的 InputStreamFileInputStream 的方法一样,可以参考《字节输入输出流:InputStream & OutputStream》和《文件字节输入输出流:FileInputStream & FileOutputStream》,这里就不再赘述。

代码案例

该代码案例重点介绍如何将字节数组转为流的,流的读取等操作与InputStreamFileInputStream 相同,不是本文的重点。

案例一:通过字节数组创建实例

代码示例:

public static void read1() throws IOException {
    // 创建一个字节数组。
    byte[] bytes = {97, 98, 99, 100, 101};
    // 将字节数组转为流 ByteArrayInputStream
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

    // 循环判断可读取字节数
    while (bais.available() > 0) {
        // 读取一个字节
        System.out.println((char) bais.read());
    }

    // 关闭流并释放资源
    bais.close();
}

输出内容:

a
b
c
d
e

案例二:通过字节数组和偏移量创建实例

代码示例:

public static void read2() throws IOException {
    // 创建一个字节数组。
    byte[] bytes = {97, 98, 99, 100, 101};
    // 将字节数组转为流 ByteArrayInputStream
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes, 0, 3);

    // 循环判断可读取字节数
    while (bais.available() > 0) {
        // 读取一个字节
        System.out.println((char) bais.read());
    }

    // 关闭流并释放资源
    bais.close();
}

输出内容:

a
b
c

ByteArrayOutputStream(字节数组输出流)

ByteArrayOutputStream 类会在内部创建一个字节数组缓冲区,所有写入输出流的数据会被保存到该缓冲区中。当数据写入缓冲区时,缓冲区的长度会自动增长,可以使用 toByteArray()toString() 来检索缓冲区中的数据。

内部字段

byte[] buf

存储数据的内部缓冲区数组。

int count

缓冲区中的有效字节数。

构造函数

创建该字节数组输出流有两种方式。

ByteArrayOutputStream()

创建一个 ByteArrayOutputStream 实例,并创建一个内部缓冲区,大小使用默认值32。

ByteArrayOutputStream(int size)

创建一个 ByteArrayOutputStream 实例,并创建一个内部缓冲区,大小使用指定的 size

常用方法

该类的常用方法与前面介绍的 OutputStreamFileOutputStream 的方法基本相同,可以参考《字节输入输出流:InputStream & OutputStream》和《文件字节输入输出流:FileInputStream & FileOutputStream》。

这里主要列举一些不同的方法,主要有:

void writeTo(OutputStream out)

该当前输出流中的缓冲数据全部写入到另一个指定的输出流中。

byte[] toByteArray()

创建一个新的字节数组。它的大小与缓冲区大小相同,并且缓冲区的有效内容也复制到其中。

String toString()

将缓冲区中的字节转换为字符串,使用默认的字符集。

String toString(String charsetName)

将缓冲区中的字节转换为字符串,使用指定的字符集。

代码案例

该代码案例重点介绍如何将流转为字节数组的,流的写入等操作与OutputStreamFileOutputStream 相同,不是本文的重点。

案例一:创建一个字节数组输出流,缓冲区大小默认32

代码示例:

public static void write1() throws IOException {
    // 创建一个字节数组。
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    // 写入一个字节
    baos.write(97);
    // 写入一个字节
    baos.write(98);
    // 写入一个字节
    baos.write(99);
    // 写入一个字节
    baos.write(100);
    // 写入一个字节
    baos.write(101);

    // 获取输出流中的字节,并打印至控制台
    byte[] bytes = baos.toByteArray();
    System.out.println(new String(bytes));

    // 关闭流并释放资源
    baos.close();
}

输出内容:

abcde

案例二:创建一个字节数组输出流,缓冲区大小指定

代码示例:

public static void write2() throws IOException {
    // 创建一个字节数组。
    ByteArrayOutputStream baos = new ByteArrayOutputStream(3);

    // 写入一个字节
    baos.write(97);
    // 写入一个字节
    baos.write(98);
    // 写入一个字节
    baos.write(99);
    // 写入一个字节
    baos.write(100);
    // 写入一个字节
    baos.write(101);

    // 将缓冲区中的字节转为字符串,并打印至控制台
    System.out.println(baos.toString());

    // 关闭流并释放资源
    baos.close();
}

输出内容:

abcde

系列文章

🔥 【Java I/O 流】文件的操作——java.io.File 类详解

🔥 【Java I/O 流】I/O 流的原理与流的分类

🔥 【Java I/O 流】字节输入输出流:InputStream & OutputStream

🔥 【Java I/O 流】文件字节输入输出流:FileInputStream & FileOutputStream(文件读写案例)

🔥 【Java I/O 流】字符输入输出流:Reader 和 Writer

🔥 【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter

🔥 【Java I/O 流】字节缓冲流:BufferedInputStream 和 BufferedOutputStream

🔥 【Java I/O 流】字符缓冲流:BuffreadReader 和 BufferedWriter

热门专栏

👍 《Java 教程:从入门到精通

👍 《MySQL 教程:从入门到精通

在这里插入图片描述

相关文章
|
6月前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java输入输出:什么是NIO(New I/O)?
63 1
|
17天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
5月前
|
存储 缓存 Java
Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问
【6月更文挑战第22天】Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问。`BufferedInputStream`和`BufferedOutputStream`用于字节流,缓存数据批量读写。`BufferedReader`和`BufferedWriter`处理字符流,支持按行操作。使用后务必关闭流。
68 3
|
6月前
|
存储 监控 Java
深入探索Java语言的NIO(New I/O)技术
深入探索Java语言的NIO(New I/O)技术
|
4月前
|
存储 缓存 Oracle
可能是最漂亮的Java I/O流详解
大家有什么思路吗?评论区一起讨论讨论。我需要使用 Java 逐行读取大约 5-6 GB 的大型文本文件。我怎样才能快速完成此操作?最高赞的回答是叫Peter Lawrey的老哥回答的。大家好,我是南哥。一个Java学习与进阶的领路人,今天指南的是Java I/O流,跟着南哥我们一起在Java之路上成长。本文收录在我开源的《Java学习进阶指南》中,涵盖了想要学习Java、成为更好的Java选手都在偷偷看的核心知识、面试重点。
123 1
可能是最漂亮的Java I/O流详解
|
4月前
|
Java Linux
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
|
4月前
|
Java API 开发者
Java中的文件I/O操作详解
Java中的文件I/O操作详解
|
5月前
|
Java 视频直播 数据库连接
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
66 2
|
5月前
|
存储 网络协议 Java
Java I/O 详解:基础、文件操作与 NIO 实践
Java I/O 详解:基础、文件操作与 NIO 实践
54 1
|
4月前
|
Java 数据库
Java面试题:请解释Java中的输入输出(I/O)流?详细说明应用场景
Java面试题:请解释Java中的输入输出(I/O)流?详细说明应用场景
35 0