`

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  
多谢 解决了困扰我的问题

相关推荐

    node 标准输入流和输出流代码实例

    本文将深入探讨如何在Node.js中使用标准输入流和标准输出流,并通过代码实例来展示它们的工作原理。 首先,标准输入流(stdin)是程序接收数据的通道,通常来自键盘或其他外部数据源。在Node.js中,我们可以使用`...

    c# 调用外部程序,Process初体验

    在C#编程语言中,通过使用`System.Diagnostics.Process`类可以轻松实现调用外部程序的功能。根据提供的文件信息,本文将详细介绍如何利用`Process`类来执行DOS命令,并深入探讨其中涉及的关键概念和技术细节。 ### ...

    C#process类的使用

    `Process.StandardInput`、`Process.StandardOutput`和`Process.StandardError`分别代表进程的标准输入、输出和错误流,它们允许你向进程发送数据并接收其响应。例如,如果你启动了一个接受命令行输入的进程,可以...

    Process启动进程完成交互并获取输出例程.zip

    在描述提到的博客文章中,作者可能详细讲解了如何创建和使用`QProcess`对象,包括设置工作目录、连接信号槽来处理进程事件、正确处理输出和错误流等。通过阅读博客和解压后的"untitled1"文件,你可能会看到一个完整...

    使用C#8.0中的异步流简化调用外部进程。_C#_下载.zip

    "使用C#8.0中的异步流简化调用外部进程"这个资源包可能包含了如何在C# 8.0中利用异步流优化`Process`类的示例和指导,帮助开发者编写更高效、更易读的代码,同时保持应用的响应性。通过理解异步流的概念以及如何与`...

    利用管道重定向cmd输入输出源码

    ### 利用管道重定向CMD输入输出的知识点详解 ...综上所述,通过API函数创建和使用管道来重定向CMD的输入输出是一项非常实用的技术,它不仅可以简化自动化任务的编写过程,还可以提高程序的性能和效率。

    实现ffmpeg将RTSP流封装成mp4、avi、flv文件的源码

    具体实现可能包括初始化FFmpeg上下文、设置输入输出参数、打开输入流、创建输出流、读取和写入数据以及关闭流的步骤。 8. FFmpeg命令行使用: 虽然这里提供的是源码实现,但通常情况下,用户可以通过FFmpeg的...

    Java中使用Runtime和Process类运行外部程序.docx

    在处理外部进程时,一定要注意异常处理,确保正确关闭输入、输出和错误流,避免资源泄漏。同时,考虑到跨平台兼容性,可能需要根据操作系统的不同选择相应的命令解释器。通过`System.getProperty("os.name")`可以...

    C#跨应用程序调用。项目可以启动其他程序获取输出

    另外,如果你需要与其他应用程序进行更复杂的交互,如传递参数、接收输入或者等待程序结束,可以使用`ProcessStartInfo.Arguments`属性设置命令行参数,`process.WaitForExit()`方法来同步等待程序结束。 总结来说...

    Java代码中调用shell脚本和python脚本并获得输出结果(分为小数据量和大数据量).docx

    原因是`process.waitFor()`会在输入流缓冲区填满之前阻塞,导致进程无法继续输出数据。为了解决这个问题,我们可以使用一个额外的线程来不断地从输入流中读取数据,这样就可以确保数据能够及时被处理,而不会堵塞...

    Java调用外部程序命令

    当使用Java调用外部程序时,可能会遇到程序无法正常退出的情况,通常这是由于进程的输入/输出流未被正确处理造成的。 - **解决方案1:** 关闭标准输入流 当外部程序等待标准输入时,如果没有关闭标准输入流,会...

    Java Process类的详解及实例代码

    Java中的`Process`类是用于表示操作系统级别的进程的抽象类。这个类允许Java应用程序与操作系统交互,执行系统命令,例如启动新的进程、读取进程的...了解并掌握如何正确使用`Process`类是Java开发者的必备技能之一。

    数据流图和数据字典

    2. **加工(Process)**:描述数据的转换过程,即输入数据如何被处理以产生输出数据。 3. **数据存储(Data Store)**:表示系统中存储数据的地方,如文件、数据库等。 4. **外部实体(External Entity)**:指系统...

    Jbpm 工作流 编程步骤全过程

    - **数据(Data)**:在流程中流动的信息,包括输入数据和输出数据,用于支持活动的执行和决策。 - **流程定义(Process Definition)**:预定义的业务流程逻辑,定义了活动之间的顺序和关系。 - **流程实例...

    关于过大的占用内存的方法1

    此外,如果需要向子进程传递输入,可以使用`Process.getOutputStream()`获取子进程的输入流,并写入数据。 总结来说,使用`Runtime.exec()`执行外部命令时,必须注意处理子进程的输入、输出和错误流,以防止内存...

    VHDL数据流描述的译码器设计

    仿真则是为了验证设计的功能正确性,确保在所有可能的输入情况下,译码器都能产生预期的输出。 通过`Decoder2`这个文件名我们可以推测,这可能是该2-4线译码器设计的具体实现文件,可能包含了上述的VHDL代码。在...

    4-child_process (子进程).pdf

    在Node.js中,`child_process`模块是用于创建...在实际开发中,理解并正确使用`child_process`模块可以极大地提升Node.js应用程序的功能性和效率,同时要注意进程管理和资源消耗的问题,尤其是在处理大量并发子进程时。

    java-call-exe-program.rar_java 调用exe

    在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如调用外部的exe可执行文件。...理解并正确使用`Runtime`和`ProcessBuilder`,可以帮助Java开发者更高效地与操作系统进行交互。

    工作流模型验证—基于化简

    他们在2000年发表的论文《Using Graph Reduction Techniques for Analysing Process Models》中详细介绍了如何使用图约简技术来验证流程模型。该方法不仅能够有效检测模型中的潜在错误,还能提高整体验证过程的效率...

    工作流流程编辑器(含全部源码)

    每个活动都有其特定的输入和输出,它们通过连接线串联起来,形成完整的流程路径。 3. **工作流引擎**:工作流引擎是驱动流程运行的软件组件,它解析流程定义,根据业务数据和规则来调度活动的执行。引擎通常包含...

Global site tag (gtag.js) - Google Analytics