java objectInputstream中的readObject如何知道要读取多少字节?

时间:2012-09-07 05:08:43

标签: java python sockets java-io

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

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

  

现在,如果你仔细想一想,你就会意识到这一点   套接字的基本事实:消息必须是固定长度的   (哎呀),或被划定(耸肩),或表明它们有多长(很多   更好),或通过关闭连接结束。选择是   完全是你的,(但有些方式比其他方式更严格)。

然而在另一个SO answer中,@ David Crawshaw提到了`

  

因此readObject()不知道它将读取多少数据,所以它确实如此   不知道有多少物品可供使用。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

readOject()方法使用BlockedInputStream来读取字节。如果检查readObject的{​​{1}},它正在调用

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(); } bin bin.readByte().,而BlockiedDataInputStream依次使用PeekInputStream来读取它。此类最后使用的是InputStream.read()。 从read方法的描述:

/**
     * 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.So正如EJP所提到的,它永远不知道有多少字节需要读取。希望这能帮助你理解它。