Process输入流输出流的正确使用
程序员文章站
2022-06-05 15:08:04
...
#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(); } } }
上一篇: 红枣水的好处有哪些,应该如何正确泡红枣水
下一篇: 设置高德地图在Fragment中显示