当我将I / O流包装两次时会发生什么? [英] What happens when I wrap I/O streams twice?

查看:128
本文介绍了当我将I / O流包装两次时会发生什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I know that java I/O uses decorator pattern. But I feel that I understand its wrong.

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

Please clarify difference between two code snippets:

    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());

此应用程序符合我的预期,我在控制台中看到结果。

This application works according my expectations and I see result in console.

我尝试将ObjectInputStream和ObjectOutputStream包装两次:

I try to wrap ObjectInputStream and ObjectOutputStream twice:

        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());

此代码暂停。我不明白为什么。请澄清。

This code just hangs up. I don't understand why. please clarify.

PS

这只是理论问题。

由于我使用管道(根据EJP回答),确实挂起了行为。

Really hangs up behaviour happens because of I use pipes (According EJP answer).

例如这段代码符合预期。

for example this code works according expectations.

            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个装饰器的输出。这是真的吗?

looks like if I wrap input by 10 decorators I should wrap output by 10 decorators at the same order. Is it true ?

我注意到只有刷新的问题:

I noticed that problem with flushing only:

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。

You're misusing piped streams. They are intended to be used by a producer thread doing writes and a consumer thread doing reads. See the Javadoc.

管道流共享一个缓冲区,如果读取线程未读取,则可以填充该缓冲区,从而拖延写入线程。

The piped streams share a buffer which can fill if the reading thread isn't reading, which stalls your writing thread.

两次包装流与它没有任何关系,尽管在这种情况下它肯定既无意义又有问题。

Wrapping streams twice doesn't have anything to do with it, although in this case it is certainly both pointless and problematic.

这篇关于当我将I / O流包装两次时会发生什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆