ホームページ >Java >&#&チュートリアル >Java の「Runtime.exec()」がパイプで予期しない結果を生成するのはなぜですか?

Java の「Runtime.exec()」がパイプで予期しない結果を生成するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-12 12:29:24550ブラウズ

Why Does Java's `Runtime.exec()` Produce Unexpected Results with Pipes?

Java のパイプと Runtime.exec()

次の Java コードを考えてみましょう。

String commandf = "ls /etc | grep release";

try {
    Process child = Runtime.getRuntime().exec(commandf);
    child.waitFor();
    InputStream i = child.getInputStream();
    byte[] b = new byte[16];
    i.read(b, 0, b.length);
    System.out.println(new String(b));
} catch (IOException e) {
    e.printStackTrace();
    System.exit(-1);
}

プログラムの出力は次のとおりです:

/etc:
adduser.co

ただし、から実行した場合シェルでは、正しく表示されます:

lsb-release

クロスプラットフォームのパイプ動作

質問で述べたように、パイプの動作はクロスプラットフォームではありません。 Java 作成者は、パイプが異なるプラットフォーム間で一貫して動作することを保証できません。

代替ソリューション

この問題に対処するには、次のオプションを検討してください:

  • スクリプトの実行: 目的のコマンド パイプラインを実行するスクリプトを作成します。個別のコマンドの代わりにスクリプトを実行します。
  • シェルの実行: sh コマンドを使用して、シェル環境内でパイプされたコマンドを実行します:
String[] cmd = {
  "/bin/sh",
  "-c",
  "ls /etc | grep release"
};

Process p = Runtime.getRuntime().exec(cmd);

以上がJava の「Runtime.exec()」がパイプで予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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