メソッドはreadOject()
BlockedInputStream を使用してバイトを読み取りreadObject
ます。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.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 に遭遇するまでバイトごとに読み取ります。したがって、EJP が述べたように、読み取るバイト数を事前に知ることはできません。これが理解に役立つことを願っています。