【问题标题】:What is restrictions in java.io for decorating streams? [duplicate]java.io 中装饰流的限制是什么? [复制]
【发布时间】:2014-08-21 07:32:45
【问题描述】:

我想像这样的装饰器模式:

我知道 java io 使用这种模式。

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

研究代码:

sn-p 1 - 工作代码:

    OutputStream outputStream = new FileOutputStream("2.txt");

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
    ObjectOutputStream objectOutputStreamWrapper = new ObjectOutputStream(objectOutputStream);     //double wrapping

    objectOutputStreamWrapper.writeObject("this is my string");
    objectOutputStreamWrapper.close();

    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("2.txt"));
    ObjectInputStream   objectInputStreamWrapper = new ObjectInputStream(objectInputStream);


    System.out.println(objectInputStreamWrapper.readObject());
    objectInputStream.close();

sn-p 2 - 不工作:

    OutputStream outputStream = new FileOutputStream("2.txt");

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
    ObjectOutputStream objectOutputStreamWrapper = new ObjectOutputStream(objectOutputStream);     //double wrapping

    objectOutputStreamWrapper.writeObject("this is my string");
    objectOutputStreamWrapper.close();

    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("2.txt"));
    //ObjectInputStream   objectInputStreamWrapper = new ObjectInputStream(objectInputStream);


    System.out.println(objectInputStream.readObject());
    objectInputStream.close();

输出:

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)

sn-p 3 - 不工作

    OutputStream outputStream = new FileOutputStream("2.txt");

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
  //  ObjectOutputStream objectOutputStreamWrapper = new ObjectOutputStream(objectOutputStream);     //double wrapping

    objectOutputStream.writeObject("this is my string");
    objectOutputStream.close();

    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("2.txt"));
    ObjectInputStream   objectInputStreamWrapper = new ObjectInputStream(objectInputStream);


    System.out.println(objectInputStreamWrapper.readObject());
    objectInputStream.close();

输出:

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)

看起来在文件系统上的文件中存储了有关流装饰顺序的信息。这对我来说很奇怪。请澄清这个误解。

我是否总是应该对输入和输出使用完全相同的装饰器顺序?

【问题讨论】:

  • 这绝对是另一个问题!!!

标签: java serialization io stream decorator


【解决方案1】:

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

创建一个写入指定 OutputStream 的 ObjectOutputStream。此构造函数将序列化流标头写入底层流

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

因此,如果您打开两个 ObjectOutputStream 并仅使用一个读取,反之亦然,您将不会读取所写的那么多序列化标头,从而导致它无法工作,如堆栈跟踪所示:

在 java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)

这是 ObjectOutputStream 所独有的。例如,将缓冲流包装成缓冲流就不会出现这个问题。

【讨论】:

猜你喜欢
  • 2020-06-29
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 2023-01-22
  • 2021-11-17
相关资源
最近更新 更多