领测软件测试网
软件测试技术门户`vYz2X:`$v$MV1.4 解决问题
软件测试技术门户 Jr'oT_Ct要防止管道流前两个局限所带来的问题,方法之一是用一个ByteArrayOutputStream作为代理或替代PipedOutputStream。 Listing 4显示了一个LoopedStreams类,它用一个ByteArrayOutputStream提供和Java管道流类似的功能,但不会出现死锁和 IOException异常。这个类的内部仍旧使用管道流,但隔离了本文介绍的前两个问题。我们先来看看这个类的公用方法(参见图3)。构造函数很简单,它连接管道流,然后调用startByteArrayReaderThread()方法(稍后再讨论该方法)。getOutputStream()方法返回一个OutputStream(具体地说,是一个ByteArrayOutputStream)用以替代PipedOutputStream。写入该 OutputStream的数据最终将在getInputStream()方法返回的流中作为输入出现。和使用PipedOutputStream的情形不同,向ByteArrayOutputStream写入数据的线程的激活、写数据、结束不会带来负面效果。
(i6c5Jqx(J1Q,s"|*A$N-F&B'L Y图三:ByteArrayOutputStream原理
`)v%~`-Dq)i!Jyz软件测试技术门户[s0W$XQOKw6`_软件测试技术门户J#j+i;`my【Listing 4:防止管道流应用中出现的常见问题】
BRL%zRimport java.io.*;
(NyuL heowpublic class LoopedStreams {
软件测试技术门户S2x;Y0xBr
GP private PipedOutputStream pipedOS =
软件测试技术门户L~&QG;{TN new PipedOutputStream();
Y?
Cs