Java SEByteArrayInputStream和ByteArrayOutputStream
CAMELLIA!!! note 目录
ByteArrayInputStream
和ByteArrayOutputStream
是Java中用于处理字节数据的流类,这些类位于java.io
包中。
它们主要用于在内存中读取和写入字节数据,不涉及实际的文件I/O操作。
这使得它们非常适合在处理数据时临时存储数据,例如在进行数据传输或转换时。
ByteArrayInputStream
是一个字节输入流,用于从字节数组读取数据。它允许你将字节数组作为输入源,将字节数据读入程序中。
主要特点:
- 从字节数组读取数据:你可以从一个字节数组中读取数据,而不需要从文件或网络流中读取。
- 方便数据处理:在进行数据处理或转换时,首先可以将数据加载到一个字节数组中,然后使用
ByteArrayInputStream
来读取这些数据。
- 限制:一旦创建了
ByteArrayInputStream
对象,其内部使用的字节数组大小是固定的,并且在ByteArrayInputStream
对象生命周期内,这个数组不会自动扩展。
构造方法:
1
| public ByteArrayInputStream(byte[] buf)
|
此构造方法创建一个新的ByteArrayInputStream
,用于读取指定字节数组。
使用示例:
1 2 3 4 5 6 7
| byte[] data = { 1, 2, 3, 4, 5 }; ByteArrayInputStream bais = new ByteArrayInputStream(data); int byteData; while ((byteData = bais.read()) != -1) { System.out.print(byteData + " "); } bais.close();
|
二、ByteArrayOutputStream
ByteArrayOutputStream
是一个字节输出流,用于在内存中生成字节数据。你可以使用它来将数据写入到一个字节数组中,这些数据随后可以被读取、处理或传输。
主要特点:
- 生成字节数组:可以用来生成字节数据的临时存储区,通常用于数据转换、序列化等场景。
- 动态扩展:
ByteArrayOutputStream
的内部字节数组大小会根据需要动态增长,因此不需要事先指定数组的大小。
- 与其他流结合使用:常与其他流结合使用,例如通过
ObjectOutputStream
来序列化对象。
构造方法:
1
| public ByteArrayOutputStream()
|
此构造方法创建一个新的ByteArrayOutputStream
对象,其内部字节数组的初始大小为默认值(通常是32字节)。
使用示例:
1 2 3 4 5 6
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); baos.write(65); baos.write(66); byte[] data = baos.toByteArray(); System.out.println(new String(data)); baos.close();
|
三、示例代码
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| package com.camellia.io.ByteArrayOutputStream;
import org.junit.jupiter.api.Test;
import java.io.*; import java.util.Date;
public class ByteArrayOutputInputStreamTest {
@Test public void testByteArrayOutputStream(){ ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(97); baos.write(98); baos.write(99);
byte[] byteArray = baos.toByteArray();
for(byte b : byteArray){ System.out.println(b); } }
@Test public void testWrapByteArrayOutputInputStream(){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); try(ObjectOutputStream oos = new ObjectOutputStream(baos)){ oos.writeObject(new Date()); oos.writeInt(100); oos.writeBoolean(true); oos.writeUTF("Camellia.xiaohua"); oos.flush(); byte[] bytes = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais);
System.out.println(ois.readObject()); System.out.println(ois.readInt()); System.out.println(ois.readBoolean()); System.out.println(ois.readUTF()); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
|