ホームページ >Java >&#&チュートリアル >Java プロセスで入力/出力ストリームを確実に処理するにはどうすればよいですか?

Java プロセスで入力/出力ストリームを確実に処理するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-17 21:16:11774ブラウズ

How to Reliably Handle Input/Output Streams in Java Processes?

入出力ストリームを使用した Java プロセス

この記事では、Java プロセスを操作する際の入出力ストリームの利用の複雑さについて説明します。これらのストリームの機能を維持する際に発生する課題の解決に特に焦点を当てます。

背景

提供されたコード例は、コマンドを bash シェルに入力し、その結果の出力が次のようになるシナリオを例示しています。反響した。ただし、最初の読み取り後に問題が発生し、後続の出力ストリームが操作不能になります。この記事は、これらの問題を解明し、解決策を提案することを目的としています。

問題の解決

最初のステップでは、外部プロセスの実行を簡素化する ProcessBuilder クラスを利用するようにコード スニペットを変更します。その主な利点は、子プロセスの標準エラー ストリームをその標準出力にリダイレクトできることです。

ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectErrorStream(true);
Process process = builder.start();

さらに、プロセスの標準出力の読み取りを担当するループは、終了時にのみ終了するため、ハングする傾向があります。リーダーからの -of-file。これを解決するには、シェル コマンドの出力の結論を区切るために「マジック」ラインを使用する手法が使用されます。

while (scan.hasNext()) {
    String input = scan.nextLine();
    writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n");
    writer.flush();

    line = reader.readLine();
    while (line != null && ! line.trim().equals("--EOF--")) {
        System.out.println ("Stdout: " + line);
        line = reader.readLine();
    }
    if (line == null) {
        break;
    }
}

制限

このアプローチの制限を認識することが不可欠です。 :

  • ユーザー入力を求めるコマンドにより、プログラムが表示される可能性があります応答しません。
  • 各プロセスの出力が改行で終了するという仮定は、すべての場合に当てはまらない可能性があります。
  • まれに、実行されたコマンドが「--EOF--」を出力する場合があります。誤った動作。
  • bash コマンド内の括弧が一致しないと、構文エラーが発生し、プロセスが実行される可能性があります。

結論

この記事で概説した変更は、Java プロセスを操作するときに入出力ストリームの機能を維持する際に遭遇する課題に対する包括的な解決策を提供します。この手法には一定の制限があるかもしれませんが、シェル コマンドを実行し、スケジュールされたタスクを通じてその出力を定期的に取得する信頼性の高い手段を提供します。

以上がJava プロセスで入力/出力ストリームを確実に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。