java.io中装饰流的限制是什么?
我想象装饰图案是这样的: 我知道JavaIO使用这种模式 我觉得包装对象存在一些限制,但我无法理解整个规则 研究代码: 代码段1-工作代码: 代码段2-不工作: 输出: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.
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)