私は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);
}
}
そして、ここでは外部プロセスのコードがあります。
これは決してわかりませんが、出力がヌルであるかどうかをチェックすると、まだ準備ができていないので、他のプロセスは何も出力していませんが、元のプログラムは終了している可能性がありますwhileループが終了するためです。繰り返しますが、これは単なる野生の推測です。 –
入力を送信するスレッドを作成するか、出力を読み取るスレッドを作成する必要があります。スレッドを作成せずにこれを行う方法はありません。 – VGR
[この投稿](http://stackoverflow.com/questions/18903549/writing-to-inputstream-of-a-java-process)が役に立ちます。 –