Java技巧使用管道数据流传送数据

转载 2008年05月01日 06:01:00
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

  Java I/O系统是建立在数据流概念之上的,在UNIX操作系统中有一个类似的概念很流行,那就是管道,它具有将一个程序的输出当作另一个程序的输入的能力。

  Java为这种管道概念提供了PipedInputStream和PipedOutputStream类。将这两者结合在一起,它们允许一个Java组件输出数据到输出流,而另一个组件将这个输出流当作输入流来读取。

  举个例子可以说明,比如一个用来记录应用程序日志信息的组件和一个用来显示流数据动态报表的组件。通过给日志记录组件提供PipedOutputStream,给报表组件提供相应的PipedInputStream,这两个组件就不用知道对方的情况而可以相互通信。

  最简单的情况下,代码段如下所示:

  importJava.io.*;

  public class Foo {

  static public void main(String[] args) throwsIOException {

  PipedOutputStream pout = newPipedOutputStream();

  PipedInputStream= new PipedInputStream(pout);

  for(int i=0; i < 100; i++) {

  pout.write((byte)i );

  }

  pout.close();

  int j=0;

  while( (j = pin.read()) != -1)

  {

  System.err.println(j);

  }

  pin.close();

  }

  }

  上面的代码中,一定要记得调用close()以关闭输出流"pout",否则第二轮循环永远也不会结束。

  这个粗泛的例子并不是正常的可用的代码。随着第一轮循环数量越来越大,PipedOutputStream中的缓冲将会用尽,从而出现问题,比如它在等待某些程序从流里面删除数据时会导致线程死锁。

  这就是为什么管道流的Javadoc中声明了PipedInputStream和PipedOutputStream必须用在多线程环境里面的原因。

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

使用管道数据流传送数据

 Java I/O系统是建立在数据流概念之上的,在UNIX操作系统中有一个类似的概念很流行,那就是管道,它具有将一个程序的输出当作另一个程序的输入的能力。 Java为这种管道概念提供了PipedInp...
  • Class_Raito
  • Class_Raito
  • 2009-01-05 15:33:00
  • 503

Java流编程实例之六--数据流

7. 数据流数据流DataOutputStream和DataInputStream用来将Java的简单数据类型和字符串保存为二进制格式,并从二进制格式读取。使用它们时需要注意以下几点: 第一,Dat...
  • LogicTeamLeader
  • LogicTeamLeader
  • 2016-09-28 20:35:46
  • 759

Linux学习——数据流重定向与管道

一、数据流重定向 上图包含3种数据流: 1、标准输入流(stdin):代码为0,符号为; 3、标准错误流(stderr):代码为2,符号为2>或2>>。 将数据从指定的流输入或输出,就称为数据...
  • Jeff_Yellow
  • Jeff_Yellow
  • 2016-06-04 17:13:37
  • 667

软件架构风格整理(1 数据流风格)

1         数据流风格1.1      批处理序列批处理风格的每一步处理都是独立的.并且每一步是顺序执行的.只有当前一步处理完后.后一步处理才能开始.数据传送在步与步之间作为一个整体.(组件为...
  • hawksoft
  • hawksoft
  • 2012-10-21 09:32:47
  • 6088

hadoop初读--写数据时的数据流管道双向机制

为了保证分布式数据的一致性和完整性,hadoop写数据流时使用了写数据和应答的双向机制. 这里着重说明的是反向应答其实是分为两部分: 1.写请求答应:      正常情况下,这个应答...
  • zhusirong
  • zhusirong
  • 2017-11-13 11:16:35
  • 144

Java实现文件写入——IO流(输入输出流详解)

输入输出的重要性: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;输入和输出功能是Java对程序处理数据能力的提高,Java以流的形式处理数据。...
  • zch19960629
  • zch19960629
  • 2017-09-09 20:43:12
  • 210

c++ 编写管道命令的技巧

shell里的管道非常方便和好用,但不是所有命令都可以直接放在管道符("|")后面接收管道输出的数据。能接收管道输出的数据并正确处理的命令称之为管道命令,这需 要命令本身支持,如ls就不是管道命令。...
  • tsxw24
  • tsxw24
  • 2013-10-24 16:56:28
  • 3100

管道的限度及实现

一,linux上的pipe size:          用 pathconf 或 fpathconf 函数可以确定管道的大小,也就是确定PIPE_BUF的值,这个值由内核设定。   ...
  • qingdou_aixuexi
  • qingdou_aixuexi
  • 2016-07-03 12:07:04
  • 514

[原]从管道传送数据到ffmpeg进行视频编码

在windows编译ffmpeg,一般的方法是mingw+msys,编译出来的是windows的可执行文件ffmpeg.exe。 阅读 ffmpeg 源码的时候,发现 ffmpeg 支持 pipe,...
  • maikforever
  • maikforever
  • 2011-08-04 13:17:31
  • 4540

java 读取数据流的几种情况总结

Java读取数据流经常会出问题,结合自己项目中遇到的问题,对此进行一些总结。 当用读取的本地的数据流时,可以利用read()方法把数据读入。关键代码如下: byte[...
  • u014600432
  • u014600432
  • 2015-01-31 19:58:16
  • 4510
收藏助手
不良信息举报
您举报文章:Java技巧使用管道数据流传送数据
举报原因:
原因补充:

(最多只允许输入30个字)