java - 如何将两个字符串和一个 List<byte[]> 聚合为一个 byte[],然后提取它们

标签 java android sockets io arrays

我需要将 2 个字符串和一个列表聚合到一个 byte[] 中,以便通过网络发送它(使用具有 send(byte[]) 函数的特殊库。

然后,在另一端,我需要取回 3 个不同的对象。

我已经做了一个丑陋的实现,但它非常慢。基本上,我所做的是

        public byte[] myserializer(String dataA, String dataB, List<byte[]> info) {

        byte[] header = (dataA +";" + dataB + ";").getBytes();

        int numOfBytes = 0;
        for (byte[] bs : info) {
            numOfBytes += bs.length;
        }

        ByteArrayOutputStream b = new ByteArrayOutputStream();
        ObjectOutputStream o;
        try {
            o = new ObjectOutputStream(b);
            o.writeObject(info);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        byte[] data = b.toByteArray();

        int length = header.length + data.length;
        byte[] headerLength = (new Integer(header.length)).toString()
                .getBytes();
        byte[] pattern = ";".getBytes();
        int finalLength = headerLength.length + pattern.length + length;

        byte[] total = new byte[finalLength];enter code here
        total = // Copy headerLength, header and total into byte[] total

        return return;

本质上,我正在创建一个看起来像这样的框架

      HEADER                    INFO

(---------------------------------------------- -)(----------------------------------) HEADER_LENGHT;DATA_A;DATA_B;SERIALIZED_LIST_OBJECT

然后,在接收方,我执行逆过程,这就是“全部”。这可行,但效率非常低且丑陋。

建议?最佳实践?有想法吗?

哦...还有一点要注意:这也必须适用于 J2SE 和 Android

非常感谢!!

最佳答案

将其全部写入 ByteArrayOutputStream ,周围有一个 ObjectOutputStream 来序列化 Strings 和 List,然后调用将 BAOS 转换为 byte[] 数组的方法。在另一端,执行相反的操作。

或者定义一个包含 {String, String, List} 的可序列化对象元组并用 ObjectOutputStream 序列化它,并用 ObjectInputStream 反序列化它。简单得多。

或者只发送三个。 TCP是字节流,消息之间没有边界,字节都是按顺序到达的。如果您想保留对网络的写入,请插入 BufferedOutputStream并在写入 List 后刷新它.

关于java - 如何将两个字符串和一个 List<byte[]> 聚合为一个 byte[],然后提取它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870715/

相关文章:

java - android.view.InflateException : Binary XML file line #9: Error inflating class com. jjoe64.graphview.helper.GraphViewXML

java - 类路径顺序因 JUnit 运行程序而异

java - 在 Java 中交换字符串值

Java Set迭代器,删除元素安全吗?

android - ConstraintLayout,当约束依赖 View 消失时,布局 View 行为怪异

sockets - R socketConnection/make.socket() : any way to keep listen()ing?

PHP 与 C++ 应用程序的通信

android - 能否在 XML 布局文件中将一个 View 设置为另一个 View 的属性?

android - 文本输入布局 : RuntimeException - Failed to resolve attribute at index 24

客户端到客户端的连接?