[解決済み] ProcessBuilder。メインスレッドをブロックすることなく、起動したプロセスの標準出力と標準エラー出力を転送する。
2022-11-26 15:29:37
質問
JavaでProcessBuilderを使用して、以下のようなプロセスを構築しています。
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
さて、私の問題は次のようなものです。そのプロセスの標準出力や標準エラー出力をキャプチャし、それを
System.out
に非同期でリダイレクトしたい。プロセスとその出力リダイレクションはバックグラウンドで実行されるようにしたい。 今のところ、これを行うために私が見つけた唯一の方法は、手動で新しいスレッドを生成し、継続的に
stdOut
から継続的に読み込む新しいスレッドを手動で生成し、適切な
write()
のメソッドを呼び出します。
System.out
.
new Thread(new Runnable(){
public void run(){
byte[] buffer = new byte[8192];
int len = -1;
while((len = stdOut.read(buffer)) > 0){
System.out.write(buffer, 0, len);
}
}
}).start();
このアプローチは一応うまくいきますが、ちょっと汚い感じがします。その上、管理し正しく終了させるために、もう1つスレッドを与えてしまうのです。これを行うためのより良い方法はありますか?
どのように解決するのですか?
以下のような場合 Java 7 以降 については、Evgeniy Dorofeevの 回答 .
については
Java 6 およびそれ以前
を作成し、使用します。
StreamGobbler
:
StreamGobbler errorGobbler =
new StreamGobbler(p.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler =
new StreamGobbler(p.getInputStream(), "OUTPUT");
// start gobblers
outputGobbler.start();
errorGobbler.start();
...
private class StreamGobbler extends Thread {
InputStream is;
String type;
private StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
System.out.println(type + "> " + line);
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
関連
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
プロジェクトの依存関係を解決できない。
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
Junitのユニットテストはjava.lang.Testを報告します。
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
maven レポート エラー 解決不可能な親POM
-
コンストラクタDate()が未定義である問題
-
Java基礎 - マッピングとQ/A
-
アクセス制限の解決方法: ---- in Java
-
htmlとwordの相互変換の実装(画像あり)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
Uncaught ReferenceError: は定義されていません。
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
-bash: java: コマンドが見つからない 解決方法
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み】スキャナー vs. BufferedReader