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

为什么没有更多的Java代码使用PipedInputStream / PipedOutputStream?

洪楚
2023-03-14
问题内容

我最近发现了这个习惯用法,我想知道是否有我想念的东西。我从未见过使用过它。我几乎使用过的几乎所有Java代码都倾向于将数据插入字符串或缓冲区,而不是像本示例那样(例如,使用HttpClient和XML
API):

    final LSOutput output; // XML stuff initialized elsewhere
    final LSSerializer serializer;
    final Document doc;
    // ...
    PostMethod post; // HttpClient post request
    final PipedOutputStream source = new PipedOutputStream();
    PipedInputStream sink = new PipedInputStream(source);
    // ...
    executor.execute(new Runnable() {
            public void run() {
                output.setByteStream(source);
                serializer.write(doc, output);
                try {
                    source.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }});

    post.setRequestEntity(new InputStreamRequestEntity(sink));
    int status = httpClient.executeMethod(post);

该代码使用Unix管道样式的技术来防止将XML数据的多个副本保留在内存中。它使用HTTP Post输出流和DOM Load / Save
API将XML文档序列化为HTTP请求的内容。至于我可以告诉它最大限度地减少用很少的额外代码使用的内存(只是几行了RunnablePipedInputStreamPipedOutputStream)。

那么,这个成语怎么了?如果这个习语没什么问题,我为什么还没有看到呢?

编辑:阐明PipedInputStreamPipedOutputStream替换在各处显示的样例逐个缓冲区的副本,它们还允许您在处理输入数据的同时写出处理过的数据。他们不使用OS管道。


问题答案:

从Javadocs:

通常,一个线程从PipedInputStream对象读取数据,而另一线程将数据写入相应的PipedOutputStream。不建议尝试从单个线程使用两个对象,因为这可能使线程死锁。

这可以部分解释为什么它不更常用。

我认为另一个原因是许多开发人员不了解其目的/好处。



 类似资料:
  • 今天我在家里的电脑上安装了netbean,以便在家做一些工作。我安装了java 8 JDK(151),并安装了包含所有内容的netbean(没有进行自定义安装)。然后我把我的项目从github上撤下来。 我的安装文件夹是在E:\netbean我的项目文件夹是默认的c: 我加载了项目,打开XAMPP并运行它。太好了,很管用。 然后我对HTML进行了更改(修复了我犯的一个拼写错误)。再次运行。找不到零

  • 问题内容: 我意识到字节码与本机代码(可移植性)的好处。 但是要说您始终知道您的代码将在x86架构上运行,为什么不为x86编译并获得性能收益呢? 请注意,我假设本机代码编译会提高性能。有些人回答说,实际上没有任何收获对我来说是个新闻。 问题答案: 因为性能提升(如果有)是不值得的。 同样, 垃圾回收 对于性能也很重要。很有可能JVM的GC优于嵌入在已编译的可执行文件中的GC,例如使用GCJ。 而

  • 问题内容: 我见过的几乎每个Java项目都使用Maven或Ant。它们是很好的工具,我认为几乎任何项目都可以使用它们。但是,什么都发生在使?它用于各种非Java项目,并且可以轻松处理Java。当然,如果使用Windows,则必须下载make.exe,但JDK并不随附Ant和Maven。 与Java一起使用时,make是否存在一些基本缺陷?仅仅是因为Ant和Maven是用Java编写的吗? 问题答案

  • 问题内容: 许多Java书籍都将该语句描述为比该语句快。但是我没有找到任何地方为什么切换比if更快。 例 我有一种情况,我必须选择两项中的任何一项。我可以使用 要么 考虑item和BREAD是一个恒定的int值。 在上面的示例中,哪个操作更快,为什么? 问题答案: 因为有很多情况下,有一些特殊的字节码可以有效地评估switch语句。 如果使用IF语句实现,则将进行检查,跳转到下一个子句,进行检查,

  • 问题内容: 我正在阅读有关ConcurrentModificationException以及如何避免它的信息。找到了一篇文章。该文章中的第一个清单具有与以下相似的代码,这显然会导致异常: 然后,它继续以各种建议解释如何解决该问题。 当我尝试重现它时,我没有遇到异常! 为什么我没有得到例外? 问题答案: 根据JavaAPI文档,Iterator.hasNext不会抛出。 检查后,您从列表中删除了一个

  • 我想安装Primeng7.0.0到我的Angular项目,但首先我需要更新我的JHipster到最后一个版本。 当我将此命令写入terminal时,我得到以下错误