java 如何从字节数组中读取接下来的n个字节?

omtl5h9j  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(133)

我已经将一个文件加载到字节数组中:

import java.nio.file.{Files, Paths}    
val byteArray = Files.readAllBytes(Paths.get("/path/to/file"))

现在我想遍历这个字节数组,以n字节为增量,如下所示:
1.读取前4个字节,作为int
1.读取下一个1字节,作为bool
1.读取接下来的64个字符,作为UTF8字符串。
做这件事的最好方法是什么?

nkoocmlb

nkoocmlb1#

新增Scala版本:
在Scala中,您可以使用与Java相同的Java库(下面的示例)。主要区别在于语法,例如使用val声明变量。除此之外,代码本质上与Java版本相同。

val buffer = ByteBuffer.wrap(byteArray)

// Read the first 4 bytes as an int
val intValue = buffer.getInt()

// Read the next byte as a boolean
val booleanValue = buffer.get() != 0.toByte

// Read the next 64 bytes as a string
val bytesForStringValue = new Array[Byte](64)
buffer.get(bytesForStringValue)
val stringValue = new String(bytesForStringValue, StandardCharsets.UTF_8)

Java版本:

如果您想坚持使用nio包,可以将数组 Package 在ByteBuffer中

ByteBuffer buffer = ByteBuffer.wrap(byteArray);

然后检索如下值

int intValue = buffer.getInt();
boolean booleanValue = buffer.get() != 0;

byte[] bytesForStringValue = new byte[64];
buffer.get(bytesForStringValue);
String stringValue = new String(bytesForStringValue, StandardCharsets.UTF_8);

使用InputStreams还有其他选项

DataInputStream inputStream = new DataInputStream(new BufferedInputStream(new FileInputStream("/path/to/file")));

然后使用DataInputStream提供的功能提取所需的值:

int intValue = inputStream.readInt();
boolean booleanValue = inputStream.readBoolean();

byte[] bytesForStringValue = new byte[64];
inputStream.readFully(bytesForStringValue);
String stringValue = new String(bytesForStringValue, "UTF-8");

相关问题