将ArrayList<String>转换为byte []

15

我有一个 ArrayList<String>,想通过UDP发送,但是发送方法需要 byte[]

有人能告诉我如何将我的 ArrayList<String> 转换为 byte[] 吗?

谢谢!


http://www.java2s.com/Code/JavaAPI/java.util/ArrayListtoArrayTa.htm - Claus Jørgensen
3个回答

21

这取决于你希望在另一端如何解码这些字节。一个合理的方法是像DataOutputStream一样使用UTF-8编码,对列表中的每个字符串进行编码。 对于一个字符串,它会写入两个字节来表示UTF-8编码的长度,然后是UTF-8字节。 如果你在另一端没有使用Java,那么这种方法是可移植的。以下是使用Java编码和解码ArrayList<String> 的示例:

// example input list
List<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");

// write to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
for (String element : list) {
    out.writeUTF(element);
}
byte[] bytes = baos.toByteArray();

// read from byte array
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DataInputStream in = new DataInputStream(bais);
while (in.available() > 0) {
    String element = in.readUTF();
    System.out.println(element);
}

您可能想首先发送长度,因为available()通常不是一个好的方法。 - Peter Lawrey
1
你可能需要在for循环后添加out.flush();。这将确保所有数据都被发送到流中。 - cobarzan

11

如果对方也是Java,您可以使用ObjectOutputStream。它将序列化对象(您可以使用ByteArrayOutputStream获取写入的字节)。


0
另一种解决方案是将ArrayList中每个字符串中的每个字节添加到List中,然后将该列表转换为数组。
    List<String> list = new ArrayList<>();
    list.add("word1");
    list.add("word2");

    int numBytes = 0;
    for (String str: list)
        numBytes += str.getBytes().length;

    List<Byte> byteList = new ArrayList<>();

    for (String str: list) {
        byte[] currentByteArr = str.getBytes();
        for (byte b: currentByteArr)
            byteList.add(b);
    }
    Byte[] byteArr = byteList.toArray(new Byte[numBytes]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接