A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhaojian 中级黑马   /  2014-6-11 17:00  /  788 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhaojian 于 2014-6-12 13:56 编辑
  1. /*编写两个线程子类,分别用来创建管道输出流和管道输入流,
  2. 其中管道输出流向管道发送5个0~20之间的随机整数;
  3. 管道输入流接收管道中传过来的5个随机整数,并求他们的和。
  4. 编写Java应用程序测试管道流的数据传送。*/

  5. import java.io.*;
  6. class  PipedText
  7. {
  8.         public static void main(String[] args) throws Exception
  9.         {
  10.                 PipedInputStream pis=new PipedInputStream();
  11.                 PipedOutputStream pos=new PipedOutputStream();
  12.                 pos.connect(pis);
  13.                 PipedInput pi=new PipedInput(pis);
  14.                 PipedOutput po=new PipedOutput(pos);
  15.                 new Thread(pi).start();
  16.                 new Thread(po).start();
  17.         }
  18. }
  19. class PipedInput implements Runnable
  20. {
  21.         private PipedInputStream pis;
  22.         PipedInput(PipedInputStream pis)
  23.         {
  24.                 this.pis=pis;
  25.         }
  26.         //管道输入流接收发送过来的数,并打印它们的和
  27.         public void run()
  28.         {
  29.                 try
  30.                 {
  31.                         byte [] buf=new byte[100];
  32.                         int len=0;
  33.                         int sum=0;
  34.                         while((len=pis.read(buf))!=-1)
  35.                         {
  36.                                 String s=new String(buf,0,len);
  37.                                 //System.out.println(s+"--s");
  38.                                 int i=Integer.parseInt(s);
  39.                                 sum+=i;
  40.                         }
  41.                         System.out.println(sum);
  42.                         pis.close();
  43.                 }
  44.                 catch (IOException io)
  45.                 {
  46.                         throw new RuntimeException();
  47.                 }
  48.         }
  49. }
  50. class PipedOutput implements Runnable
  51. {
  52.         private PipedOutputStream pos;
  53.         PipedOutput(PipedOutputStream pos)
  54.         {
  55.                 this.pos=pos;
  56.         }
  57.         //管道输出流发送5个0-20的随机数
  58.         public void run()
  59.         {
  60.                 try
  61.                 {
  62.                         for (int x=0;x<5 ;x++ )
  63.                         {
  64.                                 int i=(int)(Math.random()*20);
  65.                                 //System.out.println(i+"....i");
  66.                                 String s=i+"";
  67.                                 pos.write(s.getBytes());
  68.                                 pos.flush();
  69.                         }
  70.                         pos.close();
  71.                 }
  72.                 catch (IOException io)
  73.                 {
  74.                         throw new RuntimeException();
  75.                 }
  76.         }
  77. }
复制代码
最后打印结果总是不对,如果不注释掉了中间的两个打印语句,就能打印出正确结果,应该数据都存到缓冲区里了,然后一次都读出来了,有什么解决办法只打印最后结果,能不能再帮忙优化一下代码。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马