3

JAVA コードからシステム コマンドを実行する際に奇妙な問題に直面しています。
実際にMac OSXは、JAVA アプリからシステム情報を取得したいと考えています。
そのために私は使用しています

Runtime.getRuntime().exec("system_profiler -detailLevel full");

これは正常に動作しています。出力を印刷すると、クールです。しかし、将来使用するためにこの情報をplistファイルに書きたいと思います。そのために、.like の -xml 引数を使用しsystem_profiler

 String cmd = "system_profiler -detailLevel full -xml > "+System.getProperty( "user.home" )+"/sysinfo.plist";
 Process p = Runtime.getRuntime().exec(cmd); 

基本的に、これにより、現在のユーザーのホーム ディレクトリに plist ファイルが作成されます。

しかし、これはファイルに何も書いていないようです。

ここで何か不足していますか?

4

2 に答える 2

7

私のJavaはさびているだけではありませんので、優しくしてください。;-)

  1. Runtime.exec()渡されたコマンドを実行するためにシェルを自動的に使用しないため、IO リダイレクトは何も実行しません。

  2. あなただけを使用する場合:

    "/bin/sh -c system_profiler -detailLevel full > path/file.plist"
    

    次に、文字列は次のようにトークン化されます。

    { "/bin/sh", "-c", "system_profiler", "-detailLevel", "full", ">", "path/file.plist" }
    

    -c単一の引数しか期待しないため、これも機能しません。

代わりにこれを試してください:

String[] cmd = { "/bin/sh", "-c", "system_profiler -detailLevel full > path/file.plist" };
Process p = Runtime.getRuntime.exec(cmd);

もちろん、をProcess使用してインスタンスの出力を読み取り、Process.getInputStream()それを必要なファイルに書き込むこともできます。したがって、シェル、IO リダイレクトなどを完全にスキップします。

于 2011-08-26T05:31:38.657 に答える
5

Christian.K は完全に正しいです。完全な例を次に示します。

public class Hello {

  static public void main (String[] args) {
    try {
      String[] cmds = {
        "/bin/sh", "-c", "ls -l *.java | tee tmp.out"};
      Process p = Runtime.getRuntime().exec (cmds);
      p.waitFor ();
      System.out.println ("Done.");
    }
    catch (Exception e) {
      System.out.println ("Err: " + e.getMessage());
    }
  }
}

パイプ ( |) またはリダイレクト ( ) を使用していない場合は、元のコマンドのように で>問題ありません。String cmd = "ls -l *.java"

実際に Java コンソール ウィンドウで出力を確認したい場合、 を呼び出す必要もありますProcess.getInputStream()

ここに良いリンクがあります: Javaアプリケーションでシステムコマンドを実行する

于 2011-08-26T06:01:01.937 に答える