当前位置: 首页 > 面试题库 >

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

朱慈
2023-03-14
问题内容

我知道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。

管道传输的流共享一个缓冲区,如果读取线程不读取该缓冲区,则该缓冲区可以填满,这会使您的写入线程停滞。

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



 类似资料:
  • 在第5章 管理ElasticSearch的 选择正确的directory实现类——存储模块 一节中讲到了存储类型,即用户可以根据业务需求来配置存储模块。但是我们并没有介绍存储模块的每一个知识点——至少没有介绍I/O限流的相关知识。 控制I/O流量

  • 我做了研究,发现应该这样做我不知道java对象像指针一样工作。我以为只有当两个对象相等时才会传递值。我甚至创建了一个简单的测试应用程序,它可以设置和获取一个对象的数量。再一次,我把这两个对象都等同起来。更改一个对象的元素似乎也会影响另一个对象。我不知道该怎么在谷歌上搜索这个。所以我才把整个故事都告诉你。我只得到与c编程有关的文档。我觉得我的底子都碎了。我现在才知道是如何工作的。我试着做 这不影响N

  • 字节流(Byte Streams) 字节流处理原始的二进制数据 I/O。输入输出的是8位字节,相关的类为 InputStream 和 OutputStream. 字节流的类有许多。为了演示字节流的工作,我们将重点放在文件 I/O字节流 FileInputStream 和 FileOutputStream 上。其他种类的字节流用法类似,主要区别在于它们构造的方式,大家可以举一反三。 用法 下面一例子

  • 尝试将数据发布到api时出错。下面是代码片段。期待早日得到帮助!谢谢 7组织。springframework。网状物客户ResourceAccessException:“jirasdtest.myoutotec.com/rest/api/2/issue/SD-1043/comment”的POST请求出现I/O错误:连接超时;嵌套异常为java。网SocketTimeoutException:连接在

  • 4.9. I/O包 接下来我们使用open/close/read/write等基本的系统调用实现一个用于文件IO的包。 让我们从文件file.go开始: 05 package file 07 import ( 08 "os" 09 "syscall" 10 ) 12 type File struct { 13

  • 问题内容: 有许多不同的I / O 流(FileInputStream,FileOutputStream,FileReader,FileWriter,BufferedStreams等),我在确定它们之间的差异时感到困惑。在哪些示例中,一种流类型优先于另一种流类型,它们之间的真正区别是什么? 问题答案: 这是一个大话题!我建议您先阅读I / O流 : I / O流代表输入源或输出目的地。流可以表示许