PipedInputStream - 如何避免“java.io.IOException:管道损坏”

2024-04-07

我有两个线程。其中一个写入 PipedOutputStream,另一个从相应的 PipedInputStream 读取。背景是一个线程正在从远程服务器下载一些数据,并通过管道流将其复用到多个其他线程。

问题是有时(尤其是下载大文件时)(>50Mb)文件)我得到java.io.IOException:管道损坏当尝试从 PipedInputStream 读取时。
Javadoc 说A pipe is said to be broken if a thread that was providing data bytes to the connected piped output stream is no longer alive.
确实如此,我的写线程在将他的所有数据写入PipedOutputStream后确实死掉了。

有什么解决办法吗?如何防止 PipedInputStream 抛出此异常?我希望能够读取写入 PipedOutputStream 的所有数据,即使写入线程完成了工作。 (如果有人知道如何保持写入线程处于活动状态直到读取所有数据,那么这个解决方案也是可以接受的).


使用 java.util.concurrent.CountDownLatch,并且在第二个线程发出已完成从管道读取的信号之前不要结束第一个线程。

更新:快速而肮脏的代码来说明我下面的评论

    final PipedInputStream pin = getInputStream();
    final PipedOutputStream pout = getOutputStream();

    final CountDownLatch latch = new CountDownLatch(1);

    InputStream in = new InputStream() {

        @Override
        public int read() throws IOException {
            return pin.read();
        }

        @Override
        public void close() throws IOException {
            super.close();
            latch.countDown();
        }
    };


    OutputStream out = new OutputStream(){

        @Override
        public void write(int b) throws IOException {
            pout.write(b);
        }

        @Override
        public void close() throws IOException {
            while(latch.getCount()!=0) {
                try {
                    latch.await();
                } catch (InterruptedException e) {
                    //too bad
                }
            }
            super.close();
        }
    };

    //give the streams to your threads, they don't know a latch ever existed
    threadOne.feed(in);
    threadTwo.feed(out);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PipedInputStream - 如何避免“java.io.IOException:管道损坏” 的相关文章

随机推荐

  • 为什么在传递给参数时不能隐式构造一个给定合适构造函数的对象?

    在下面的示例中 为什么我不能简单地传递一个string to the printFoo include
  • PHP REST API 路由

    我一直在研究 API 并为我们正在进行的项目开发 REST API API 只接受来自一个 JSON 格式的源的连接 我理解这一点很好 如果理解了所说的大部分内容 但是我不明白第三个代码示例以及路由信息的去向 他们提供的例子是 data R
  • 暴露 angular.js 中的 JavaScript 错误

    在某些情况下 角度引擎不会输出原始数据javascript错误 例如 myapp directive helloWorld function return scope restrict AE template p Hello World m
  • Android 将图标变成另一个图标

    如何实现一个图标转变为另一个图标的动画 例如汉堡变成箭头 导航抽屉 或铅笔变成十字 收件箱 我怎样才能存档这个动画 图标动画可以使用以下方式实现animated vector http developer android com refer
  • Xcode 6 Storyboard Unwind Segue 与 Swift 未连接退出

    当尝试将导航栏按钮连接到 Xcode 6 中 ViewController 的退出项时 不太确定这是否是 Xcode 6 问题 但值得一提 因为它处于测试阶段 它在自定义类中找不到 Swift 函数 它应该找到的函数 IBAction fu
  • 处理过期的VOIP推送

    所以我有 VOIP 呼叫应用程序 一切正常 一个用户可以呼叫其他用户并且可以通话 但我面临的问题是我不明白如何解决这个问题 问题 当user1呼叫user2时 user1向user2发送voip推送请求 但是当收到推送通知时 user2 处
  • Firebase 托管未验证 GoDaddy 中的 TXT 记录

    我部署了我的应用程序 现在我正在尝试添加我的自定义 URL 我按照 Firebase 的说明将他们的 TXT 记录添加到我的 DNS GoDaddy 中 但现在 Firebase 表示尚未得到验证 我认为我做错了什么 但这里没有什么可搞乱的
  • QVBoxLayout:如何使用 Qt 设计器将小部件对齐到顶部

    我仅将 qt 设计器用于 ui 布局 这与这个问题几乎是同一个问题 QVBoxLayout 如何将小部件垂直对齐到顶部而不是中心 https stackoverflow com questions 10082299 qvboxlayout
  • Php:查找 Chrome 和 Safari 浏览器

    我使用下面的代码来查找用户代理 user agent SERVER HTTP USER AGENT if preg match MSIE i user agent echo Internet Explorer if preg match F
  • 安装分析后,我的 Worklight 6.2 控制台上没有运行时

    我刚刚安装了Worklight 6 2服务器 使用配置工具部署了一个简单的项目 并且运行正常 然后我按照知识中心的说明安装分析 之后 当我在浏览器中打开 WL 控制台时 我收到 找不到运行时 分析似乎运行良好 我的 war 文件位于 Lib
  • 如何在teamcity中运行e2e测试,如何在后台运行服务器并运行e2e

    如何在 teamcity 构建步骤中运行我需要的服务器以及 e2e 测试 我对我的 Angular 2 应用程序进行了 Protractor e2e 测试 我有一个有趣的 Angular cli 和 gulp 组合 但请耐心等待 这是我在本
  • 使用 SUBSTR Oracle SQL 将 SPACE 添加到 CONCAT

    我试图将两列连接在一起 并用空格分隔 第一列需要 SUBSTR 另一列则不需要 我写了这个查询 SELECT CONCAT SUBSTR FIRST NAME 1 1 LAST NAME AS NAME FROM OEHR EMPLOYEE
  • 在caffe prototxt 文件中。 TRAIN 和 TEST 阶段做什么?

    我是咖啡新手 感谢你们 in https github com BVLC caffe blob master src caffe proto caffe proto https github com BVLC caffe blob mast
  • 为什么在 PHP 中使用 FPDF 时亚洲 unicode 字符没有出现在 PDF 上?

    我在用FPDF http www fpdf org 创建 PDF 并tFPDF http www fpdf org en script script92 php允许使用 unicode 字符 例如中文 日文或韩文 我正在使用 tFPDF 示
  • 如何测试角度事件?

    我需要测试事件是否正确发出或广播 并手动触发事件 最好的方法是什么 如果您只需要对事件触发和捕获进行一些测试 我就是这样做的 为了确保某个事件被触发 emit ed or broadcast ed 间谍是正确的选择 您需要对将调用的范围的引
  • ICommand MVVM 实现

    因此 在我正在执行的这个特定 MVVM 实现中 我需要几个命令 我真的厌倦了逐个实现 ICommand 类 因此我想出了一个解决方案 但我不知道它有多好 因此我们将非常感谢这里任何 WPF 专家的意见 如果您能提供更好的解决方案 那就更好了
  • 电子预警系统。如何在没有初始同步的情况下获取最新的SyncState?

    假设我的文件夹中有 100 000 条消息 我希望能够与最新更改同步 但我不需要任何旧消息 请求初始同步 SyncFolderItems null syncState 会带回所有 100 000 条消息 我不需要 如何在不从服务器读取 10
  • 如何获取一个月中的工作日列表?

    在另一个问题中 https stackoverflow com questions 3849975 how to get all dates in a given month in c它展示了如何获取一个月中的所有天数 我需要同样的东西 但
  • JMS 有哪些替代方案? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PipedInputStream - 如何避免“java.io.IOException:管道损坏”

    我有两个线程 其中一个写入 PipedOutputStream 另一个从相应的 PipedInputStream 读取 背景是一个线程正在从远程服务器下载一些数据 并通过管道流将其复用到多个其他线程 问题是有时 尤其是下载大文件时 gt 5