Java 当我包装I/O流两次时会发生什么?

Java 当我包装I/O流两次时会发生什么?,java,io,stream,wrapper,decorator,Java,Io,Stream,Wrapper,Decorator,我知道javai/O使用decorator模式。但我觉得我理解这是错误的 请澄清两段代码之间的区别: 片段1: 这个应用程序按照我的期望工作,我在控制台中看到了结果 片段2: 我尝试包装ObjectInputStream和ObjectOutputStream两次: PipedInputStream pipedInputStream = new PipedInputStream(); PipedOutputStream pipedOutputStream = new

我知道javai/O使用decorator模式。但我觉得我理解这是错误的

请澄清两段代码之间的区别:

片段1: 这个应用程序按照我的期望工作,我在控制台中看到了结果

片段2: 我尝试包装ObjectInputStream和ObjectOutputStream两次:

        PipedInputStream pipedInputStream = new PipedInputStream();
        PipedOutputStream pipedOutputStream = new PipedOutputStream();
        pipedOutputStream.connect(pipedInputStream);


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

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

        ObjectInputStream objectInputStream = new ObjectInputStream(pipedInputStream);
        ObjectInputStream   objectInputStreamWrapper = new ObjectInputStream(objectInputStream);

        System.out.println(objectInputStreamWrapper.readObject());
这段代码刚刚挂断。我不明白为什么。请澄清

p.S.

这只是一个理论问题

更新 由于我使用管道(根据EJP的回答),出现了真正的挂断行为

例如,此代码根据预期工作

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

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

            objectOutputStreamWrapper.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();
看起来如果我用10个decorator包装输入,我应该用10个decorator以相同的顺序包装输出。这是真的吗

更新+1 我注意到仅冲洗的问题:

PipedInputStream pipedInputStream = new PipedInputStream();
    PipedOutputStream pipedOutputStream = new PipedOutputStream();
    pipedOutputStream.connect(pipedInputStream);


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

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

    objectOutputStreamWrapper.flush();

    ObjectInputStream objectInputStream = new ObjectInputStream(pipedInputStream);
    ObjectInputStream   objectInputStreamWrapper = new ObjectInputStream(objectInputStream);

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

你误用了管道流。它们用于生产者线程执行写操作,消费者线程执行读操作。请参阅Javadoc

管道流共享一个缓冲区,如果读取线程不读取,缓冲区可以填充,这会使您的写入线程暂停

将流包装两次与此无关,尽管在这种情况下,这肯定是毫无意义和有问题的

PipedInputStream pipedInputStream = new PipedInputStream();
PipedOutputStream pipedOutputStream = new PipedOutputStream();
pipedOutputStream.connect(pipedInputStream);
//writing 
ObjectOutputStream objectOutputStream = new ObjectOutputStream(pipedOutputStream);
//ObjectOutputStream objectOutputStreamWrapper =new ObjectOutputStream(objectOutputStream);
//ObjectOutputStream objectOutputStreamWrapper1=new ObjectOutputStream(objectOutputStreamWrapper);
//objectOutputStreamWrapper1.writeObject("this is my string");
//objectOutputStreamWrapper1.flush();
objectOutputStream.writeObject("this is my string");
//reading 
ObjectInputStream objectInputStream = new ObjectInputStream(pipedInputStream);
//ObjectInputStream objectInputStreamWrapper = new ObjectInputStream(objectInputStream);
//ObjectInputStream objectInputStreamWrapper1=new ObjectInputStream(objectInputStreamWrapper);
//System.out.println("going to read from piped source");
//System.out.println(objectInputStreamWrapper1.readObject());
System.out.println(objectInputStream.readObject());
代码段1-使用管道流创建OutputStream,然后输入流通过缓冲区直接从管道接收数据,而无需刷新

Update+1-使用OutputStream包装器创建的OutputStream依次使用另一个包装器(对包装器stations进行注释)等在刷新station后工作。Flush explicity将缓冲数据刷新到底层流,在我们的示例中是管道输出流或输出流


嵌套流可以像FilterOutputStream一样使用,也可以在ObjectOutputStream之上使用。

我怀疑这是否会起作用,流会损坏。在管道java文档中,写一篇关于可能死锁的文章。我更新了主题。你能回答这个可选问题吗?
PipedInputStream pipedInputStream = new PipedInputStream();
PipedOutputStream pipedOutputStream = new PipedOutputStream();
pipedOutputStream.connect(pipedInputStream);
//writing 
ObjectOutputStream objectOutputStream = new ObjectOutputStream(pipedOutputStream);
//ObjectOutputStream objectOutputStreamWrapper =new ObjectOutputStream(objectOutputStream);
//ObjectOutputStream objectOutputStreamWrapper1=new ObjectOutputStream(objectOutputStreamWrapper);
//objectOutputStreamWrapper1.writeObject("this is my string");
//objectOutputStreamWrapper1.flush();
objectOutputStream.writeObject("this is my string");
//reading 
ObjectInputStream objectInputStream = new ObjectInputStream(pipedInputStream);
//ObjectInputStream objectInputStreamWrapper = new ObjectInputStream(objectInputStream);
//ObjectInputStream objectInputStreamWrapper1=new ObjectInputStream(objectInputStreamWrapper);
//System.out.println("going to read from piped source");
//System.out.println(objectInputStreamWrapper1.readObject());
System.out.println(objectInputStream.readObject());