java从DataInputStream中读取未知格式

时间:2014-03-03 20:34:46

标签: java io packets datainputstream

我正在开发一个客户端服务器应用程序,它将使用UDP和数据包进行通信。

我将使用DataOutputStream和DataInputStream对这些数据包中的解码数据进行编码。

我希望存储数据的方式是从另一个自定义基础数据包类扩展的自定义数据包类。

此数据包基类包含一个对象列表,数据包数据(这些对象将采用多种格式; String,Int,Boolean ...),并将使用以下方法编码为DataOuputStream:

public ByteArrayOutputStream getDataOS(){
    ByteArrayOutputStream data = new ByteArrayOutputStream();
    DataOutputStream os = new DataOutputStream(data);

    try {
        for(Object obj : packetData){
            if(obj instanceof String)
                os.writeUTF((String) obj);
            else if(obj instanceof Integer)
                os.writeInt((int) obj);
            else if(obj instanceof Byte)
                os.writeByte((Byte) obj);
            else if(obj instanceof Double)
                os.writeDouble((double) obj);
            else if(obj instanceof Boolean)
                os.writeBoolean((Boolean) obj);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } 

    return data;
}

然后将此ByteArrayOutputStream发送到我的数据包处理程序并转发到客户端/服务器。

我遇到的路障是关于如何在另一端读取此数据包DataInputStream。

由于我不知道每个对象的格式是什么,我将无法使用is.readUTF()读取它们。例如。

我认为解决这个问题的一种方法是在每个发送的对象之前发送一个字节对象类型标识符。 I.e int为0,UTF为1,依此类推。这将允许我通过在字节类型标识符上使用case语句来准备读取的每个对象。

这显然会为我的数据包添加更多数据,这不是最佳选择。我想这样做的原因是为了避免硬编码每个数据读取,可能是数百个数据包。

我的问题究竟是什么,如果这是一种明智的方式来解决这个问题?或者是否有更简单的方式通过自定义结构化数据包发送,并在另一侧读取它们不一定知道数据格式..?

1 个答案:

答案 0 :(得分:1)

显然你必须在每个项目之前写一个令牌,宣布它是什么类型。

或者使用ObjectOutputStream,只需编写和读取对象,并在* receiving * end使用instanceof。