我有一个对象数组。这些对象提供了方法
toByteArray()
。
如果我调用 foo.toByteArray()
我将获得该对象的字节表示形式。
我正在努力将这个对象数组转换为字节数组。
我的第一个方法是:
Arrays.stream(fooArray).map((fooEntry) -> fooEntry.toByteArray()).toArray();
但是,这确实返回一个对象数组而不是 byte[]。 做我想做的事最简单的方法是什么?
数组是可序列化的,因此只要您的对象也是可序列化的,那么您应该能够将数组转换为 byte[],而无需访问元素的 toByteArray() 方法。
首先确保您的对象是可序列化的:
public class MyObject implements Serializable {
//... Your class
}
现在您应该能够使用
ByteArrayOutputStream:
序列化整个数组
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(fooArray);
oos.flush();
byte[] byteArray = bos.toByteArray();
我不确定这是否是最好的方法,因为我对 Java 还很陌生,但这应该可行。
基于以下问题的已接受答案...
Java中使用流的byte[]到byte[]的ArrayList
并简单实现方法
toByteArray
,希望以下内容能够满足您的需求。 (代码后面有注释。)
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Arrays;
public class Foo {
public byte[] toByteArray() {
return new byte[]{(byte) -1};
}
public static void main(String[] args) {
Foo[] fooArray = new Foo[]{new Foo(), new Foo()};
byte[] bytes = Arrays.stream(fooArray)
.map(foo -> foo.toByteArray())
.collect(() -> new ByteArrayOutputStream(),
(b, e) -> b.write(e, 0, e.length),
(a, b) -> {
try {
b.writeTo(a);
}
catch (IOException x) {
throw new UncheckedIOException(x);
}
})
.toByteArray();
}
}
map
返回一个流,其中流中的每个元素都是字节数组,即 byte[]
。然后,您只需将所有字节数组中的所有字节收集到 ByteArrayOutputStream
中即可。然后调用类 toByteArray
的方法 ByteArrayOutputStream
。
请注意,方法
writeTo
会抛出 IOException
并且已检查的异常在 lambda 表达式中处理起来并不简单。因此它被包裹在 UncheckedIOException
中,这是一个未经检查的异常。