日期:2014-05-20  浏览次数:20825 次

管道流操作问题,求大虾解决!!
/*
需求:用多线程来操作IO流,这个流是管道流,可以操作多线程,熟悉并使用它;
思路:整体思路:多线程块和管道流块
管道流块:
1 定义管道输出流,PipedOutputStream pos;
  2 定义管道输入流,pipedInputStream pis;
3 使用管道输入流对象调用connect方法,将两个流连接起来,即pis.connect(pos);
多线程块:
1 定义一个输入类,实现Runnable接口,将管道输入流对象作为数据成员,其他构造函数同样的
2 覆盖run方法,将操作输入流的代码封装进该方法中,加不加锁看自己
3 定义一个输出类,实现Runnable接口,将管道输出流对象作为数据成员,其它的跟普通的多线程代码块相似
4 覆盖run方法,将操作输出流的代码封装进该方法中;
主函数中:
  创建管道输入输出流对象,将其传入定义好的输入输出类的构造函数中,用管道输入流类对象调用connect函数,将管道
输出流对象传入connect方法中,将两者接起来;
定义Threa的对象,将输入输出类对象传入Thread的构造方法中
然后调用Thread的start开启线程
注意:包的导入,异常处理
步骤:
*/
package pipedstream;
import java.io.*;
class Read implements Runnable
{
PipedInputStream pis;
Read(PipedInputStream pis)
{
this.pis=pis;
}
public void run()
{
System.out.println("管道输入流线程开启");
try
{
System.out.prinln("没有数据,先阻塞一会儿");
Thread.sleep(5000);
byte[]buf=new byte[1024];
int len=pis.read(buf);
String s=new String(buf,0,len);
System.out.println(s);
}
catch(IOException ioe)
{
throw new RuntimeException("管道输入流异常。。。");
}
finally
{
try
{
if(pis!=null)
pis.close();
}
catch(IOException ioe)
{
throw new RuntimeException("管道输入流关闭异常");
}
}
}
}
class Write implements Runnable
{
PipedOutputStream pos;
Write(PipedOutputStream pos)
{
this.pos=pos;
}
public void run()
{
System.out.println("管道输出流线程开启");
try
{
pos.write("pipedstream is start".getBytes());
}
catch(IOException ioe)
{
throw new RuntimeException("管道输出流异常。。。");
}
finally
{
try
{
if(pos!=null)
pos.close();
}
catch(IOException ioe)
{
throw new RuntimeException("管道输出流关闭异常");
}

}
}
}
class PipedStreamTest
{
public static void main(String []args)
{

PipedInputStream pis=new PipedInputStream();
Read r=new Read(pis);
PipedOutputStream pos=new PipedOutputStream();
Write w=new Write(pos);
try
{
pis.connect(pos);
}
catch(IOException ioe)
{
throw new RuntimeException("管道输入输出流连接异常。。。");
}
new Thread(w).start();
new Thread(r).start();
}
}
编译没有问题,运行时发生如下情况
D:\javaprog\830>java pipedstream.PipedStreamTest
管道输入流线程开启
Exception in thread "Thread-0" 管道输出流线程开启
Exception in thread "Thread-1" java.lang.RuntimeException: 管道输入流异常。。。
  at pipedstream.Read.run(PipedStream.java:49)
  at java.lang.Thread.run(Thread.java:722)
java.lang.RuntimeException: 管道输出流异常。。。
  at pipedstream.Write.run(PipedStream.java:81)
  at java.lang.Thread.run(Thread.java:722)
求解释。。。

------解决方案--------------------
你catch异常的方式很不好,导致异常的真实信息被隐藏,就很难给你有效建议了。

catch(IOException ioe)
{
throw new RuntimeException("管道输入流异常。。。");
}

建议全部都修改为:
catch(IOException ioe)
{
throw new RuntimeException("管道输入流异常。。。", ioe); // 要把异常继承下去
}

这样再重新试试看,应该能看到详细的错误信息。