Process輸入流輸出流及對C++、Python的測試
阿新 • • 發佈:2019-01-31
對C++部分的測試來自文章:
http://fair-jm.iteye.com/blog/1442267
C++程式碼
#include<iostream>
#include<string>
using namespace std;
void main(){
cout<<"hello world"<<endl;
string i;
cin>>i;
cout<<i;
}
以上是試驗目標的C++程式
以下是試驗用的java程式:
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(),則資料根本就無法傳輸。
以下是執行緒的解決方法:
Java程式碼
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(); } } }
以下是對python的測試:java程式碼:
public static void main(String args[]) { rt = Runtime.getRuntime(); String ss = "python C:\\Users\\ciabok\\Desktop\\test.py"; try { pc = rt.exec(ss); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // readIt(); 注意這樣也會產生堵塞 writeIt(); }
python程式碼:
# -*- coding=utf-8 -*-
if __name__=='__main__':
print 'test'
a=raw_input()
print a
經過測試,如果寫成 a=input() 會無法讀取,
原因不明,暫時沒找到相關資料。