外部というか子
プロセスというか。
Runtime.getRuntime().exec() で呼び出す処理のことだが
FAQになるぐらい有名なバグがある。
Q12.Runtime#exec()で実行した外部
コマンドが動いていないようです。
http://javafaq.jp/S103.htmlバッファから抜いてやらんといかんが、
execした瞬間から動き出すので、ちんたらやってはいかん。
並列でやらないとダメ。
Process proc = Runtime.getRuntime().exec("hoge");
final InputStream stdout = proc.getInputStream();
final InputStream stderr = proc.getErrorStream();
Thread outth= new Thread(new Runnable(){
public void run()
{
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
String
line;
while ((line = br.readLine()) !=
null) {
// 出力内容は好きにしれ
}
br.
close();
}
});
Thread errth= new Thread(new Runnable(){
public void run()
{
BufferedReader br = new BufferedReader(new InputStreamReader(stderr));
String line;
while ((line = br.readLine()) != null) {
// 出力内容は好きにしれ
}
br.close();
}
});
outth.start();
errth.start();
proc.waitFor();
outth.join();
errth.join();
stdout.close();
stderr.close();
こんな感じかのぅ。最後のjoinはwaitFor抜けた時にどうせ終わってるんだが、
スレッドのお作法として書いておいたぜ。
エラー処理とかは適宜いれよう。
無理矢理インナークラスにしなくても別個にクラス書いた方が
汎用性が高いのだが、この事象に遭遇するときは大概が
実装もれのケースなのでパッチワークとして書くならこの書き方が
便利かな、という超個人的な意見である。
このバグは優先度が低いので放置プレーっぷりが凄まじい。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4109888最後の方の
I know it's a low priority, but please give this bug a little love.
4 years since the last post on this. Please? 11 years is a long time to wait.
が涙を誘う。
超俺的意訳すると
「(´・ω・`)うん、わかってるんだ。これ優先度低いよね。
でもね、ちょっとぐらいかまってほしいんだ・・。」
「最後の投稿が4年前とかどうゆうことだお(^ω^#)
11年放置とかいい加減に汁。」
うーむ・・。バグから仕様に進化しそうな勢いだねぇ。
posted by koteitan at 11:08|
Comment(0)
|
TrackBack(0)
|
Java
|

|