1. 程式人生 > >Process輸入流輸出流及對C++、Python的測試

Process輸入流輸出流及對C++、Python的測試


對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() 會無法讀取,
原因不明,暫時沒找到相關資料。