gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:42:36 25 4
gpt4 key购买 nike

我知道java I/O 使用装饰器模式。但我觉得我理解错了。

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

代码片段 1:

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


ObjectOutputStream objectOutputStream = new ObjectOutputStream(pipedOutputStream);

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

ObjectInputStream objectInputStream = new ObjectInputStream(pipedInputStream);

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

这个应用程序按照我的预期运行,我在控制台中看到了结果。

代码片段 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());

这段代码就挂断了。我不明白为什么。请澄清。

附注

这只是理论问题。

更新

由于我使用管道,确实发生了挂断行为(根据 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 个装饰器包装输入,我应该以相同的顺序用 10 个装饰器包装输出。这是真的吗?

更新+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。

管道流共享一个缓冲区,如果读取线程不读取,该缓冲区可能会被填充,从而导致写入线程停止。

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

关于java - 当我将 I/O 流包装两次时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24480095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com