#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();
}
}
}
分享到:
相关推荐
本文将深入探讨如何在Node.js中使用标准输入流和标准输出流,并通过代码实例来展示它们的工作原理。 首先,标准输入流(stdin)是程序接收数据的通道,通常来自键盘或其他外部数据源。在Node.js中,我们可以使用`...
在C#编程语言中,通过使用`System.Diagnostics.Process`类可以轻松实现调用外部程序的功能。根据提供的文件信息,本文将详细介绍如何利用`Process`类来执行DOS命令,并深入探讨其中涉及的关键概念和技术细节。 ### ...
`Process.StandardInput`、`Process.StandardOutput`和`Process.StandardError`分别代表进程的标准输入、输出和错误流,它们允许你向进程发送数据并接收其响应。例如,如果你启动了一个接受命令行输入的进程,可以...
在描述提到的博客文章中,作者可能详细讲解了如何创建和使用`QProcess`对象,包括设置工作目录、连接信号槽来处理进程事件、正确处理输出和错误流等。通过阅读博客和解压后的"untitled1"文件,你可能会看到一个完整...
"使用C#8.0中的异步流简化调用外部进程"这个资源包可能包含了如何在C# 8.0中利用异步流优化`Process`类的示例和指导,帮助开发者编写更高效、更易读的代码,同时保持应用的响应性。通过理解异步流的概念以及如何与`...
### 利用管道重定向CMD输入输出的知识点详解 ...综上所述,通过API函数创建和使用管道来重定向CMD的输入输出是一项非常实用的技术,它不仅可以简化自动化任务的编写过程,还可以提高程序的性能和效率。
在处理外部进程时,一定要注意异常处理,确保正确关闭输入、输出和错误流,避免资源泄漏。同时,考虑到跨平台兼容性,可能需要根据操作系统的不同选择相应的命令解释器。通过`System.getProperty("os.name")`可以...
具体实现可能包括初始化FFmpeg上下文、设置输入输出参数、打开输入流、创建输出流、读取和写入数据以及关闭流的步骤。 8. FFmpeg命令行使用: 虽然这里提供的是源码实现,但通常情况下,用户可以通过FFmpeg的...
另外,如果你需要与其他应用程序进行更复杂的交互,如传递参数、接收输入或者等待程序结束,可以使用`ProcessStartInfo.Arguments`属性设置命令行参数,`process.WaitForExit()`方法来同步等待程序结束。 总结来说...
原因是`process.waitFor()`会在输入流缓冲区填满之前阻塞,导致进程无法继续输出数据。为了解决这个问题,我们可以使用一个额外的线程来不断地从输入流中读取数据,这样就可以确保数据能够及时被处理,而不会堵塞...
当使用Java调用外部程序时,可能会遇到程序无法正常退出的情况,通常这是由于进程的输入/输出流未被正确处理造成的。 - **解决方案1:** 关闭标准输入流 当外部程序等待标准输入时,如果没有关闭标准输入流,会...
Java中的`Process`类是用于表示操作系统级别的进程的抽象类。这个类允许Java应用程序与操作系统交互,执行系统命令,例如启动新的进程、读取进程的...了解并掌握如何正确使用`Process`类是Java开发者的必备技能之一。
2. **加工(Process)**:描述数据的转换过程,即输入数据如何被处理以产生输出数据。 3. **数据存储(Data Store)**:表示系统中存储数据的地方,如文件、数据库等。 4. **外部实体(External Entity)**:指系统...
- **数据(Data)**:在流程中流动的信息,包括输入数据和输出数据,用于支持活动的执行和决策。 - **流程定义(Process Definition)**:预定义的业务流程逻辑,定义了活动之间的顺序和关系。 - **流程实例...
此外,如果需要向子进程传递输入,可以使用`Process.getOutputStream()`获取子进程的输入流,并写入数据。 总结来说,使用`Runtime.exec()`执行外部命令时,必须注意处理子进程的输入、输出和错误流,以防止内存...
仿真则是为了验证设计的功能正确性,确保在所有可能的输入情况下,译码器都能产生预期的输出。 通过`Decoder2`这个文件名我们可以推测,这可能是该2-4线译码器设计的具体实现文件,可能包含了上述的VHDL代码。在...
在Node.js中,`child_process`模块是用于创建...在实际开发中,理解并正确使用`child_process`模块可以极大地提升Node.js应用程序的功能性和效率,同时要注意进程管理和资源消耗的问题,尤其是在处理大量并发子进程时。
在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如调用外部的exe可执行文件。...理解并正确使用`Runtime`和`ProcessBuilder`,可以帮助Java开发者更高效地与操作系统进行交互。
他们在2000年发表的论文《Using Graph Reduction Techniques for Analysing Process Models》中详细介绍了如何使用图约简技术来验证流程模型。该方法不仅能够有效检测模型中的潜在错误,还能提高整体验证过程的效率...
每个活动都有其特定的输入和输出,它们通过连接线串联起来,形成完整的流程路径。 3. **工作流引擎**:工作流引擎是驱动流程运行的软件组件,它解析流程定义,根据业务数据和规则来调度活动的执行。引擎通常包含...