如何将对象数组转换为byte[]

问题描述 投票:0回答:2

我有一个对象数组。这些对象提供了方法

toByteArray()
。 如果我调用
foo.toByteArray()
我将获得该对象的字节表示形式。

我正在努力将这个对象数组转换为字节数组。

我的第一个方法是:

Arrays.stream(fooArray).map((fooEntry) -> fooEntry.toByteArray()).toArray();

但是,这确实返回一个对象数组而不是 byte[]。 做我想做的事最简单的方法是什么?

java arrays java-stream byte
2个回答
0
投票

数组是可序列化的,因此只要您的对象也是可序列化的,那么您应该能够将数组转换为 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 还很陌生,但这应该可行。


0
投票

基于以下问题的已接受答案...
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
中,这是一个未经检查的异常。

© www.soinside.com 2019 - 2024. All rights reserved.