2012-07-02 99 views
5

我如何從Java發送字符串數據到一個C++控制檯應用程序在Windows下?我試圖做到這一點:寫C++控制檯應用程序催生在Java應用程序在Windows

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 
String o = ...; 
proc.getOutputStream().write(o.getBytes()); 

但我從來沒有看到它在C++的一面,當我這樣做:

ReadFile(stdin_h,buf, sizeof(buf), &bytes, 0) 

ReadFile永遠不會返回。

以下是進一步闡述和示例代碼。


我寫了一個簡單的C++控制檯(Win32)應用程序,它從STDIN中讀取並執行基於輸入的操作。

現在我想寫一個Java應用程序「驅動」的C++應用程序。 Java的一個應用應該:

  1. 開始使用Runtime.exec()
  2. 寫入字符串數據到C++應用程序的標準輸入
  3. 重複,直到它的時候死的C++應用程序。

我的Java應用程序似乎正在工作,但C++應用程序從未在STDIN上收到任何數據。

這裏是C++應用程序:

int main() 
{ 
    ofstream f("c:\\temp\\hacks.txt"); 

    HANDLE stdin_h = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD file_type = GetFileType(stdin_h); 
    if(file_type != FILE_TYPE_CHAR) 
     return 42; 

    f << "Pipe" << endl; 
    for(bool cont = true; cont;) 
    { 
     char buf[64*1024] = {}; 
     DWORD bytes = 0; 
     if(ReadFile(stdin_h,buf, sizeof(buf), &bytes, 0)) 
     { 
      string in(buf,bytes); 
      cout << "Got " << in.length() << " bytes: '" << in << "'" << endl; 
      f << "Got " << in.length() << " bytes: '" << in << "'" << endl; 
      if(in.find('Q')) 
       cont = false; 
     } 
     else 
     { 
      cout << "Err " << GetLastError() << " while reading file" << endl; 
      f << "Err " << GetLastError() << " while reading file" << endl; 
     } 
    } 
} 

這裏是Java方面:

public static void main(String[] args) { 
    Runtime rt =Runtime.getRuntime(); 
    try { 
     Process proc = rt.exec("c:\\dev\\hacks\\x64\\debug\\hacks.exe"); 

     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 

     int a = 0; 
     while(a < 5) 
     { 
      String o = (a == 4 ? "Q\n" : "A\n"); 
      proc.getOutputStream().write(o.getBytes()); 
      System.out.println("Wrote '" + o + "'"); 
      ++a; 
     } 
     try { 
      proc.waitFor(); 

      // TODO code application logic here 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Java_hacks.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(Java_hacks.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Java方面似乎一切正常,但我不會永遠在接受琴絃C++方面。

我在這裏做錯了什麼?如何在Windows下將字符串數據從Java發送到C++控制檯應用程序?

回答

4

爲什麼在寫入5個字符串之後,您沒有刷新Java端的輸出流?

proc.getOutputStream().flush(); 
+2

+1:嗯,因爲我不是足夠聰明,知道我應該。 :)等一下,讓我試試看。 –

+0

賓果!我知道我們不應該說「謝謝」,但謝謝。我的6小時調試會議已經結束。 –

+0

哈哈! :D \ o /很高興我對你有幫助:) – t0mm13b