2016-09-30 2 views
1

私はProcessBuilderでプロセスを作成し、外部プログラム(.jar)を実行するプログラムを持っています。外部プロセスはstdinからStringを受け取り、その文字を大文字または小文字に変換し、変換されたStringからstdoutを送信する必要があります。メインプロセスはキーボードからStringを読み込み、ストリームを使用して外部プロセスに送信し、外部プロセスの出力を出力します。しかし、私はメインプログラムを実行すると、それは外部のプロセスがその標準からのデータを読み込もうとしているようだ。 どうすればこの問題を解決できますか?これを達成する別の方法があります(外部プログラムを実行するコマンドの引数としてStringを送信する)が、ストリームを使用して行う必要があります。ここでプロセス間のJava I/O:外部プロセスがメインプロセスからデータを読み込む方法

は、メインプログラムのコードです:事前に

public static void main(String[] args) throws IOException { 
    String str, strConv=""; 
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
    char c; 

    str = input.readLine(); 

    for (int i=0; i<str.length(); i++) { 

     c = str.charAt(i); 

     if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 
      if (c == Character.toUpperCase(c)) 
       strConv += Character.toLowerCase(c); 
      else if (c == Character.toLowerCase(c)) 
       strConv += Character.toUpperCase(c); 
     } 

    } 

    System.out.print(strConv); 

} 

ありがとう:

public static void main(String[] args) throws IOException { 
    String str = JOptionPane.showInputDialog("Insert a String"); 

    String[] cmd = {"java", "-jar", 
    "ejecutable/Transformador2.jar"}; 

    Process process = new ProcessBuilder(cmd).start(); 
    InputStream is = process.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr); 

    OutputStream os = process.getOutputStream(); 
    OutputStreamWriter osw = new OutputStreamWriter(os); 
    BufferedWriter bw = new BufferedWriter(osw); 

    bw.write(str); 

    String line; 
    while ((line = br.readLine()) != null) { 
     System.out.println(line); 
    } 
} 

そして、ここでは外部プロセスのコードがあります。

+0

これは決してわかりませんが、出力がヌルであるかどうかをチェックすると、まだ準備ができていないので、他のプロセスは何も出力していませんが、元のプログラムは終了している可能性がありますwhileループが終了するためです。繰り返しますが、これは単なる野生の推測です。 –

+0

入力を送信するスレッドを作成するか、出力を読み取るスレッドを作成する必要があります。スレッドを作成せずにこれを行う方法はありません。 – VGR

+0

[この投稿](http://stackoverflow.com/questions/18903549/writing-to-inputstream-of-a-java-process)が役に立ちます。 –

答えて

0

解決:ストリームを外部プロセスに送信した後に出力ストリームを閉じる必要があります。

bw.write(str); 
bw.close(); 
0

具体的には、バッファから基本ストリームにデータをプッシュするには、bw.flush()が必要です。 bw.close()は暗黙的にバッファをフラッシュします。それが働いている理由です。

+0

これは知っておきたいことですが、bw.flush()文だけで試しても、コードは動作しません。したがって、バッファをフラッシュした後にバッファを閉じることも必要であると言えるでしょう。答えをありがとう。 – NetrunnerX

+0

リソースリークを防ぐためにストリームを常に閉じる必要があります。 Closeはストリームをフラッシュします。この特定の場合、入力読み取りのために 'BufferedReader'を使用して領域を設定します。したがって、データ量がオーバーフローしない限り、入力バッファ 'readlLine'はそれまでにボックするか、行終端文字が検出されるか、ストリームが閉じるまでデータが来ないようになります。バッファはemtpiedされ、値は 'readLine'によって返されます。大量のデータを送信する場合は、ストリームを閉じることなく動作します。 *デフォルトのバッファサイズは8192文字です* – Antoniossss