`

Process输入流输出流的正确使用

阅读更多
#include<iostream>
#include<string>
using namespace std;

void main(){
	cout<<"hello world"<<endl;
	string i;
	cin>>i;
	cout<<i;
}

Codebyfair_jm20120305 如有错误请见谅 欢迎讨论^_^

以上是试验目标的C++程序
以下是试验用的java程序:
import java.io.*;

public class TestDemo
{  
	Process pc;
	Runtime rt;
	public TestDemo() throws Exception{
	  rt=Runtime.getRuntime();
	  String [] ss={"E:\\work\\Demo\\src\\Test.exe"};
	  pc=rt.exec(ss);
      //readIt(); 注意这样也会产生堵塞
	  writeIt();
	 

	}

	public static void main(String args[]) throws Exception{
		new TestDemo();
	}

		public void writeIt(){
          OutputStream fos=pc.getOutputStream();
	      PrintStream ps=new PrintStream(fos);
	      ps.print("another\n");
		  ps.flush(); //不加这个 后面的read就读不下去了
		  readIt();
	  }

		public void readIt(){
	     InputStream ios=pc.getInputStream();
         BufferedReader br=new BufferedReader(new InputStreamReader(ios));
         String s;
   		 try{
	     while((s=br.readLine())!=null){
		 System.out.println(s);
	      }
	     br.close();
	     ios.close();
		 }catch(Exception e){
			 e.printStackTrace();
		 }
		}
   
}

以上的做法 如果ReadIt()先写 则又会产生堵塞 所以最好用线程解决之。

堵塞的产生:
你先读取输入流(相当于被调用程序的输出流getInputStream)的话 如果遇到输入的地方(cin)则输入流堵塞,等待输入(如果不用线程的话就一直堵在那,根本无法通过输出流(相当于被调用程序的输入流)无法输入信息到进程里面去)。
如果你先用输出流输入到被调用程序里面去,但遗忘了用flush(),则数据根本就无法传输。

以下是线程的解决方法:
package aa;
import java.io.*;

public class TestDemo
{  
	Process pc;
	Runtime rt;
	public TestDemo() throws Exception{
	  rt=Runtime.getRuntime();
	  String [] ss={"E:\\work\\Demo\\src\\Test.exe"};
	  pc=rt.exec(ss); 
	  new Thread(new Input()).start();
	  Thread.sleep(500);
	  new Thread(new Output()).start();


	

	}

	public static void main(String args[]) throws Exception{
		new TestDemo();
	}

	class Output implements Runnable
	{
		public void run(){
          OutputStream fos=pc.getOutputStream();
	      PrintStream ps=new PrintStream(fos);
	      ps.print("another\n");
		  System.out.println("已经输出");
		  ps.flush();
	  }
	}

    class Input implements Runnable
    {
	
		public void run(){
	     InputStream ios=pc.getInputStream();
 BufferedReader brd=new BufferedReader(new InputStreamReader(ios));
		 String s;
		 try{
	     while((s=brd.readLine())!=null){
		 System.out.println(s);
	      }
		 }catch(Exception e){
		 }
	  	  pc.destroy();
		}
    }
}
分享到:
评论
1 楼 DREAMS_ZDX 2017-05-06  
多谢 解决了困扰我的问题

相关推荐

    Activiti6.0教程例子下载

    对Demo的使用介绍在官方文档的后面才开始介绍,这里建议应用跑起来之后,先自己试试手(可看后面介绍Demo如何使用的章节),看看如何跑一个流程、整个流程是怎么流的、并随时关注数据库表里的数据的变化等,对以后的...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合...使用、DataGridView数据控件、自定义用户控件、文件基本操作、文件夹基本操作、文件流操作、加密、解密及解压缩文件、C#与Word互操作、高效...

    javaSE代码实例

    2.4.1 正确的命名标识符 20 2.4.2 提倡的命名习惯 21 2.5 小结 21 第3章 表达式——描述行为的元素 22 3.1 不简单的算术运算符 22 3.1.1 “+”运算符 22 3.1.2 “-”运算符 24 3.1.3 “*”运算符 ...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    通过我们已经学过的知识,你可以编写一个最简单的程序输出一个也许是程序世界中最有名的词语: echo "Hello World!"; ?&gt; First PHP page // Single line C++ style comment /* printing the message */ ...

    结构体(architecture)-计算机逻辑设计-[共3页].pdf

    惯例是把输入端口指 定为 in模式,把输出端口指定为out模式,把双向端口指定为 inout模式。这一良好的设计习惯, 从端口的名称和端口模式就可以一目了然地判定信号的用途、性质、来源和去向,十分方便。对 于一个...

    解决struts2下载异常的jar包 struts2-sunspoter-stream-1.0.jar

    从服务器中获取输入流,并同时与客户端建立输出流(服务器与客户端链接通过Socket进行连接) 3。当点击“保存”或“打开”时,开始传输数据。如果点击“取消”,关闭所有的流。 这里要注意的是,但是实际发现Socket...

    Linux操作系统基础教程

    关於 Process 处理的指令...............................................................................................16 六. 关於字串处理的指令...........................................................

    外文翻译 stus MVC

    To use Action, subclass and overwrite the process() method. The ActionServlet (Command) passes the parameterized classes to ActionForm using the perform() method. Again, no more dreadful request....

    整理后java开发全套达内学习笔记(含练习)

    process n. 程序, 进程 ['prɒses] protected (关键字) 受保护的,私有的 [prә'tektid] provide v.规定(供应,准备,预防)[prә'vaid] refer to v.引用 [ri'fә:][tu:] reference n. 参考(引用,涉及)['refәrәns]' ...

    C#编程经验技巧宝典

    ”操作符 22 &lt;br&gt;2.4 表达式与关键词 22 &lt;br&gt;0045 正确使用“&&”和“||” 22 &lt;br&gt;0046 如何处理程序“溢出”错误 23 &lt;br&gt;0047 有效使用base关键字 23 &lt;br&gt;0048 typeof表达式的使用 23...

    jsr80 java 访问 usb

    EndPoint 提供对 USB 端点描述符的访问、在给定设备配置中构造设备数据输入或者输出 HostFactory 包含 bootstrapping 方法 Hub 提供对 USB hub 描述符以及一些 hub 操作的访问 Interface 描述一组端点,并与一个特定...

    网管教程 从入门到精通软件篇.txt

    只有在使用故障恢复控制台时,才能使用 fixboot 命令。  fixboot [drive]  参数 驱动器  将要写入引导扇区的驱动器。它将替代默认的驱动器(即用户登录的系统分区)。例如,驱动器:D:  范例  下列命令...

Global site tag (gtag.js) - Google Analytics