Javaの:そのようなファイルやディレクトリは/ dev / nullにコマンドラインプログラムの出力をリダイレクトします

Tomahawkd:

私は現在、Javaを使用して、bashのプログラムを呼び出すことに取り組んでいます。bashのプログラム出力が多すぎるメッセージと私はそれらをリダイレクトしたいです/dev/nullしかし、私は奇妙なエラーが発生しましたNo such file or directory

ここに私のデモです。

public static void main(String[] args) {
        try {
            // Another version I've tried:
            // Process p = Runtime.getRuntime().exec("echo a > /dev/null");
            ProcessBuilder b = new ProcessBuilder("echo a");
            // b.redirectOutput(new File("/dev/null")).redirectErrorStream(true);
            b.redirectOutput(ProcessBuilder.Redirect.to(new File("/dev/null")))
                    .redirectErrorStream(true);
            Process p = b.start();
            p.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
}

そして、エラーメッセージは次の通り:

java.io.IOException: Cannot run program "echo a": error=2, No such file or directory
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
    at test.main(test.java:12)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:340)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:271)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
    ... 2 more

私が使用しているMacBookカタリナで、そして私が試したjava 1.8.0_231し、1.8.0_241オラクルから。(私のプロジェクトの依存関係の一つは、Java 8を必要とするので、私は高いJavaのバージョンを使用することができませんでした)。

ジョニ:

プロセスからの出力を無視するには、それが簡単に、使用することがよりポータブルですProcessBuilder.Redirect.DISCARD明示的な/ dev / nullのような特殊なファイル/デバイスへリダイレクトするよりも。

        b.redirectOutput(ProcessBuilder.Redirect.DISCARD)
         .redirectErrorStream(true);

使用したことを忘れるRuntime.exec-メソッドがひどく安全に使用するように設計されており、ハードされていること。あなたが入力リダイレクションを行いたい場合は"> /dev/null"、スタイル、あなたはそれを覚えておく必要がある>コマンドインタプリタのシェルではなく、オペレーティングシステムによって作成された構造である、そしてあなたはそれを使用したい場合は、シェルを実行する必要があります。

Runtime.getRuntime().exec(new String[] {"sh", "-c", "echo a > /dev/null"});

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=394694&siteId=1