0

在套接字 I/O 中,我可以知道如何objectinputstream readObject知道要读取多少字节吗?内容长度是封装在字节本身中还是只是读取缓冲区本身中的所有可用字节?

我问这个是因为我指的是 Python 套接字操作方法,它说

现在,如果您稍微考虑一下,您就会意识到套接字的一个基本事实:消息必须是固定长度的(yuck),或者是定界的(耸肩),或者表明它们有多长(更好),或者以关闭连接结束。选择完全是你的,(但有些方法比其他方法更正确)。

然而,在另一个 SO答案中,@DavidCrawshaw 提到了`

所以 readObject() 不知道它会读取多少数据,所以它不知道有多少对象可用。

我很想知道它是如何工作的......

4

2 回答 2

1

您过度解释了您引用的答案。readObject()不知道它将提前读取多少字节但是一旦开始读取,它只是根据协议解析输入流,该协议由标签、原始值和对象组成,而对象又由标签组成,原始值和其他对象。它不必提前知道。考虑 XML 的类似情况。您不知道文档将提前多长时间或每个元素,但您知道何时阅读了所有内容,因为协议会告诉您。

于 2012-09-07T05:22:50.537 回答
0

readOject()方法使用 BlockedInputStream 读取字节。如果您检查readObjectof ObjectInputStream,它正在调用

readObject0(false).

private Object readObject0(boolean unshared) throws IOException {
    boolean oldMode = bin.getBlockDataMode();
    if (oldMode) {
        int remain = bin.currentBlockRemaining();
        if (remain > 0) {
        throw new OptionalDataException(remain);
        } else if (defaultDataEnd) {
        /*
         * Fix for 4360508: stream is currently at the end of a field
         * value block written via default serialization; since there
         * is no terminating TC_ENDBLOCKDATA tag, simulate
         * end-of-custom-data behavior explicitly.
         */
        throw new OptionalDataException(true);
        }
        bin.setBlockDataMode(false);
    }

    byte tc;
    while ((tc = bin.peekByte()) == TC_RESET) {
        bin.readByte();
        handleReset();
    }

从流中读取的内容是使用binbin.readByte().来读取的。这个类最终使用的是 InputStream.read()。从 read 方法的描述中:BlockiedDataInputStreamPeekInputStream

/**
     * Reads the next byte of data from the input stream. The value byte is
     * returned as an <code>int</code> in the range <code>0</code> to
     * <code>255</code>. If no byte is available because the end of the stream
     * has been reached, the value <code>-1</code> is returned. This method
     * blocks until input data is available, the end of the stream is detected,
     * or an exception is thrown.

所以基本上它会逐个字节地读取,直到遇到 -1。所以正如 EJP 所提到的,它永远不会提前知道要读取多少字节。希望这将帮助您理解它。

于 2012-09-07T05:53:18.467 回答