- PR -

外部コマンド実行でのリダイレクトについて

1
投稿者投稿内容
AKI
会議室デビュー日: 2005/07/01
投稿数: 6
投稿日時: 2005-07-01 14:14
お初にお目にかかります。
下記内容について、ご助言を頂きたくあります。
よろしくお願い致します。

-内容-

外部コマンド(ローカルのexeファイル)を
javaで実行したいのですが、その際、入力情報をリダイレクトで受け取る必要があります。
具体的には次のようなものです。

aaa.exe < D:/test/test.txt

しかし、これを
Runtime.getRuntime().exec("aaa.exe < D:/test/test.txt");
のようにして実行しようとした場合、aaa.exeが"<"を
引数としていない旨のエラーを返します。

# コマンドプロンプト上での操作であれば正常動作します。

仕方なく今は、
aaa.exe < D:/test/test.txt
この内容をそのままbatファイルに落とし込んで、
そのbatファイルをexecの引数とすることで処理をしていますが、
javaのソース上で入力情報のリダイレクトを上手く処理する方法はないものでしょうか。

今のbatファイルの方法では、batファイルを経由するがために
exitValueで目的の処理が返すリターン値を取得できずに困っています。

以上、なにかご助言ありましたら、よろしくお願い致します。
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2005-07-01 17:51
http://javafaq.jp/S103.html#S103-02
が参考になると思います。
AKI
会議室デビュー日: 2005/07/01
投稿数: 6
投稿日時: 2005-07-01 22:20
おっきーさん、返信ありがとうございます。
なるほど、それは完全に見落としていました。

OutputStreamで流し込むことで、リダイレクトできそうですね。
簡単にですが、次のように試してみました。

ただ、結果、標準出力を行う所で処理が止まりました。
実行しようとしている外部コマンドは、
標準入力で[EOF]まで到達後、標準出力を開始するものですが、
どうも[EOF]を認識できていないために、待ち状態となっている様子です。
おって検証を行いたいと思います。

ちなみに、batファイルの方法の時、
EXIT /B %ERRORLEVEL%
を最後に追記すれば、戻り値をbatファイルへ引き継いで、
exxitValueで拾えるかと思ったのですが、
%ERRORLEVEL% では確かに値を取れるものの、
実際にexitValueで拾える値は常に0になってしまうんですね・・・


Process process = Runtime.getRuntime().exec(command);

// 標準入力
try {
BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(process.getOutputStream())));
BufferedReader br = new BufferedReader(new FileReader(filepath);
String line;
while((line = br.readLine()) != null){
bw.write(line);
}
} catch (Exception e) {
// エラー
}

〜中略〜

// 標準出力
try {
BufferedReader br = new BufferedReader((new InputStreamReader(process.getInputStream())));
String line;
while ((line = br.readLine()) != null) { //この行で処理が止まる。
textarea.append(line);
}
} catch (Exception e) {
// エラー
}
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2005-07-03 01:26
引用:

OutputStreamで流し込むことで、リダイレクトできそうですね。
簡単にですが、次のように試してみました。

ただ、結果、標準出力を行う所で処理が止まりました。




http://javafaq.jp/S103.html#S103-12
あたりが参考になるのかな。
標準出力は、別スレッドで取得すればいいかも。
AKI
会議室デビュー日: 2005/07/01
投稿数: 6
投稿日時: 2005-07-04 19:03
おっきーさん、返信ありがとうございます。
いろいろと試した結果、自分の誤りに気づきました。

文字通り簡単に試していたため、
close処理を省略していたのですが、
これが良くなかったようです。
ストリームをcloseすることで、標準入力の終了を認識できました。

また機会がありました際はご助言よろしくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)