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

2024-01-08

我最近发现了这个成语,我想知道我是否遗漏了一些东西。我从未见过它被使用过。我在野外使用过的几乎所有 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 请求的内容。据我所知,它最大限度地减少了内存的使用,只需很少的额外代码(只需几行Runnable, PipedInputStream, and PipedOutputStream).

那么,这个习语有什么问题呢?如果这个成语没有什么问题的话,为什么我没见过呢?

编辑:为了澄清,PipedInputStream and PipedOutputStream替换随处可见的样板缓冲区副本,它们还允许您在写出已处理数据的同时处理传入数据。他们不使用操作系统管道。


来自Javadocs http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 添加常见图例

    我试图做一个多图ggplot2 这是我最初的代码 nucmer s1 lt ggarrange eight uniform ten uniform twelve uniform fourteen uniform sixteen unifor
  • 一次撤销多个用户的 Oracle 权限

    我们正在合理化我们的数据库用户权限 为此 我们希望撤销授予所有用户 但不是特定角色 的架构中所有表的所有选择权限 通过一些正则表达式 我尝试创建一个通用的revoke对于每个表 给出如下内容 撤销 USER1 USER2 USER3 对 T
  • SQL*Plus 脚本执行两次

    我正在尝试使用 sqlplus 运行脚本 我的脚本是一个简单的删除语句 我通过将以下内容放入 ksh 终端来执行它 sqlplus username password sql delete societes sql sql delete s
  • AttributeError:“模块”对象没有属性“请求”

    当我在 Python 3 3 中运行以下代码时 import urllib tempfile urllib request urlopen http yahoo com 我收到以下错误 我也这样做来验证 我究竟做错了什么 The urlli
  • 如何在 Unity 协程中通过引用局部变量?

    我有一些函数可以接受 Enemy 实例并更改其字段之一 敌人类别有一些基本字段 如速度 伤害 攻击范围 每个函数只存储敌人的一个正常值 然后将当前字段更改为某个值一段时间 然后将其更改回正常状态 我在 Unity 中编写代码并使用 Coro
  • 无法在anaconda上安装tensorflow

    我正在尝试在 anaconda 上安装tensorflow i tried conda install c conda forge tensorflow 但安装卡住了Solving environment 寻找解决方案 因此有人建议使用调试
  • 使用回车键提交输入字段

    我正在构建天气应用程序 并希望使用 Enter 键将城市名称提交到服务器 我收到错误 提交不是一个函数 我想解决这个问题 并且想知道如何将值发送到 Express 服务器 以便在 API 调用中使用它 这是我的代码
  • 如何将 Beyond Compare 与 ClearCase 集成?

    我想将 Beyond Compare 与 ClearCase 集成 这样我就可以用它来比较和合并文件 而不是 ClearCase 提供的那些糟糕的工具 有人有执行此集成的说明吗 正如我的文章中提到的之前的回答 https stackover
  • 用于访问数组中第一个/最后一个元素的 Ruby 约定[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这是一个关于约定的问题 下面的两组命令返回相同的结果 a 1 2 3 a first gt 1 a 0 gt 1 a last gt 3 a 1
  • 我可以在 Android 上获得英语以外语言的语音识别吗?

    我正在尝试构建一个应用程序 将使用印地语和其他区域语言 来获取语音命令 我的应用程序中还需要文本转语音功能 我想知道是否有什么方法可以在 Android 上获得语音识别库 我在 Google 上进行了快速搜索 并在互联网上找到了几个印地语库
  • 无法 ssh 到 AWS EC2:身份文件无法访问[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • HTML 输入字段禁用输入但仍然 POST

    基本上我想要一个禁用文本字段来显示存储在数据库中的值 但我不希望用户可以编辑它 我尝试过使用disabled disabled 但随后它不再发布到我的表单处理程序 有什么建议么 thanks docu http www w3 org TR
  • 构建一台 LISP 机器需要多少原语?十个、七个还是五个?

    在这个网站上 他们说有 10 个 LISP 原语 原语是 atom quote eq car cdr cons cond lambda label apply http hyperpolyglot wikidot com lisp ten
  • 用于运行检测显示器的 Applescript

    当我将外接显示器插入 Macbook 并唤醒它时 显示器的分辨率通常是错误的 在使用 Mountain Lion 之前 我能够运行以下 applescript 来检测显示器 tell application System Preferenc
  • 给定 y 值获取 x 值:线性/非线性插值函数的一般求根

    我对插值函数的一般求根问题感兴趣 假设我有以下内容 x y data set seed 0 x lt 1 10 runif 10 0 1 0 1 y lt rnorm 10 3 1 以及线性插值和三次样条插值 f1 lt approxfun
  • 基于Memcache的消息队列?

    我正在开发一款多人游戏 它需要一个消息队列 即消息输入 消息输出 没有重复或删除的消息 假设没有意外的缓存驱逐 以下是我所知道的基于内存缓存的队列 内存缓存问 http memcachedb org memcacheq http memca
  • Prolog:寻找所有解决方案

    标题可能看起来像是一毛钱一打 但事实并非如此 该计划的目的是学习这些课程 需要 needs ece2090 1 m 13 16 ece3520 1 tu 11 14 ece4420 1 w 13 16 并将他们与有资格教授课程并且在此期间也
  • 哪些编程语言可以生成自包含的 Windows .exe?

    我想要制作一个易于部署的 Windows 应用程序 并且想知道哪些编程系统可以创建完全独立的 Windows exe 文件 另外 如果可以使用同一来源的 MacOSX 和 Linux 来完成同样的事情 这将是一个额外的好处 我查看了 Rea
  • 错误:类模板部分特化包含无法推导的模板参数

    我非常感谢您帮助弄清楚我的代码中出现的这个问题 我已将其简化为以下内容 typedef unsigned short ushort template
  • 为什么没有更多的 Java 代码使用 PipedInputStream / PipedOutputStream?

    我最近发现了这个成语 我想知道我是否遗漏了一些东西 我从未见过它被使用过 我在野外使用过的几乎所有 Java 代码都倾向于将数据放入字符串或缓冲区中 而不是像这个示例那样 例如使用 HttpClient 和 XML API final LS