使用 PipedInputStream java 写入结束死异常

Posted

技术标签:

【中文标题】使用 PipedInputStream java 写入结束死异常【英文标题】:Write end dead exception using PipedInputStream java 【发布时间】:2011-07-24 03:16:25 【问题描述】:

写结束死异常发生在以下情况: 两个线程:

A: PipedOutputStream put = new PipedOutputStream();
   String msg = "MESSAGE";
   output.wirte(msg.getBytes());
   output.flush();

B: PipedInputStream get = new PipedOutputStream(A.put);  
   byte[] get_msg = new byte[1024];
   get.read(get_msg);

情况如下:A和B同时运行,A写入管道,B读取。 B 刚刚从管道中读取,该管道的缓冲区被清除。然后 A 不会以未知的间隔将 msg 写入管道。但是,在某一时刻,B 再次读取管道并出现java.io.IOException: write end dead,因为管道的缓冲区仍然是空的。而且我不想 sleep() 线程 B 等待 A 写入管道,这也是不稳定的。如何避免和解决这个问题?谢谢

【问题讨论】:

techtavern.wordpress.com/2008/07/16/… 嘿,如果您仍然在 SO,请接受其中一个答案。他们解决了我的问题,他们值得被赞成 + 接受,这将增加他们对未来读者的知名度 【参考方案1】:

您需要在写入线程完成之前关闭 PipedOutputStream(当然在写入所有数据之后)。 PipedInputStream 在没有写入线程且 writer 未正确关闭时在 read() 上抛出此异常

【讨论】:

【参考方案2】:

当你有以下情况时会出现“Write end dead”异常:

一个 PipedInputStream 连接到一个 PipedOutputStream 和 这些管道的末端由两个不同的线程读取/写入 螺纹完成时不会关闭管道的一侧。

要解决此异常,只需在完成向管道流写入和读取字节后,在线程的可运行文件中关闭管道流即可。

这里是一些示例代码:

final PipedOutputStream output = new PipedOutputStream();
final PipedInputStream input = new PipedInputStream(output);

    Thread thread1 = new Thread(new Runnable() 
        @Override
        public void run() 
            try 
                output.write("Hello Piped Streams!! Used for Inter Thread Communication".getBytes());                       
                output.close();

             catch(IOException io) 
                io.printStackTrace();
                               
        
    );

    Thread thread2 = new Thread(new Runnable() 
        @Override
        public void run() 

            try 

                int data;

                while((data = input.read()) != -1) 
                    System.out.println(data + " ===> " + (char)data);
                

                input.close();

             catch(IOException io) 
                io.printStackTrace();
             

        
    );

    thread1.start();
    thread2.start();

完整代码在这里:https://github.com/prabhash1785/Java/blob/master/JavaCodeSnippets/src/com/prabhash/java/io/PipedStreams.java

更多详情,请看这个不错的博客:https://techtavern.wordpress.com/2008/07/16/whats-this-ioexception-write-end-dead/

【讨论】:

以上是关于使用 PipedInputStream java 写入结束死异常的主要内容,如果未能解决你的问题,请参考以下文章

java 如何使用PipedInputStream和PipedOutputStream

使用 PipedInputStream java 写入结束死异常

java.io.PipedInputStream

Java 管道PipedInputStream PipedOutStream PipedReader PipedWriter

Java IO: PipedInputStream

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