java.io中装饰流的限制是什么?

java.io中装饰流的限制是什么?,java,serialization,io,stream,decorator,Java,Serialization,Io,Stream,Decorator,我想象装饰图案是这样的: 我知道JavaIO使用这种模式 我觉得包装对象存在一些限制,但我无法理解整个规则 研究代码: 代码段1-工作代码: 代码段2-不工作: 输出: Exception in thread "main" java.io.OptionalDataException at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1361) at java.io.ObjectInputStream.

我想象装饰图案是这样的:

我知道JavaIO使用这种模式

我觉得包装对象存在一些限制,但我无法理解整个规则

研究代码:

代码段1-工作代码: 代码段2-不工作: 输出:

Exception in thread "main" java.io.OptionalDataException
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1361)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at io.WrappingUnwrappingOrderingTest.main(WrappingUnwrappingOrderingTest.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Exception in thread "main" java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2325)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2794)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
    at io.WrappingUnwrappingOrderingTest.main(WrappingUnwrappingOrderingTest.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
代码片段3-不工作 输出:

Exception in thread "main" java.io.OptionalDataException
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1361)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at io.WrappingUnwrappingOrderingTest.main(WrappingUnwrappingOrderingTest.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Exception in thread "main" java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2325)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2794)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
    at io.WrappingUnwrappingOrderingTest.main(WrappingUnwrappingOrderingTest.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
线程“main”java.io.EOFException中的异常 在java.io.ObjectInputStream$PeekInputStream.readFully处(ObjectInputStream.java:2325) 位于java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2794) 位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801) 位于java.io.ObjectInputStream。(ObjectInputStream.java:299) 位于io.wrappingwrappingorderingtest.main(WrappingUnwrappingOrderingTest.java:25) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:606) 位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 看起来文件系统上的文件中存储了有关流装饰顺序的信息。这对我来说很奇怪。请澄清这一误解

我是否应该始终对输入和输出使用严格相同顺序的装饰器?

这里的问题是,将一些字节写入底层流:

创建写入指定输出流的ObjectOutputStream。此构造函数将序列化流头写入基础流

同样,创建ObjectInputStream会读取序列化头

因此,如果打开两个ObjectOutputStreams并仅使用其中一个进行读取,或者反之亦然,则不会读取所写入的序列化头,从而导致序列化头无法工作,如堆栈跟踪中所示:

位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)

这对于ObjectOutputStream来说是非常独特的。例如,将缓冲流包装到缓冲流中不会出现此问题。

这里的问题是将一些字节写入基础流:

创建写入指定输出流的ObjectOutputStream。此构造函数将序列化流头写入基础流

同样,创建ObjectInputStream会读取序列化头

因此,如果打开两个ObjectOutputStreams并仅使用其中一个进行读取,或者反之亦然,则不会读取所写入的序列化头,从而导致序列化头无法工作,如堆栈跟踪中所示:

位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)

这对于ObjectOutputStream来说是非常独特的。例如,将缓冲流包装到缓冲流中不会出现此问题。

这里的问题是将一些字节写入基础流:

创建写入指定输出流的ObjectOutputStream。此构造函数将序列化流头写入基础流

同样,创建ObjectInputStream会读取序列化头

因此,如果打开两个ObjectOutputStreams并仅使用其中一个进行读取,或者反之亦然,则不会读取所写入的序列化头,从而导致序列化头无法工作,如堆栈跟踪中所示:

位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)

这对于ObjectOutputStream来说是非常独特的。例如,将缓冲流包装到缓冲流中不会出现此问题。

这里的问题是将一些字节写入基础流:

创建写入指定输出流的ObjectOutputStream。此构造函数将序列化流头写入基础流

同样,创建ObjectInputStream会读取序列化头

因此,如果打开两个ObjectOutputStreams并仅使用其中一个进行读取,或者反之亦然,则不会读取所写入的序列化头,从而导致序列化头无法工作,如堆栈跟踪中所示:

位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)


这对于ObjectOutputStream来说是非常独特的。例如,将缓冲流包装成缓冲流不会有这个问题。

这绝对是另一个问题!!!这绝对是另一个问题!!!这绝对是另一个问题!!!这绝对是另一个问题!!!您能否澄清将标题写入底层流的原因?请参阅。标题包含流魔法和流版本。您能否澄清将标题写入基础流的原因?请参阅。标题包含流魔法和流版本。您能否澄清将标题写入基础流的原因?请参阅。标题包含流魔法和流版本。您能否澄清将标题写入基础流的原因?请参阅。标题包含流魔术和流版本。
Exception in thread "main" java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2325)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2794)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
    at io.WrappingUnwrappingOrderingTest.main(WrappingUnwrappingOrderingTest.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)