1

Java バッチ アプリケーションを使用して、Unix マシンでファイルを untar しようとしています。

ソースコード:

String fileName = "x98_dms_12";
       
Runtime.getRuntime().exec("gunzip "+ fileName + ".tar.gz");
System.out.println(" Gunzip:"+"gunzip "+ fileName + ".tar.gz");

Runtime.getRuntime().exec("tar -xvf "+ fileName + ".tar");
System.out.println(" Extract:tar -xvf "+ fileName + ".tar");

問題の説明:

バッチ プログラムを実行すると、(完全に) 動作しません。gunzip コマンドのみが機能し、fileName.tar.gz を fileName.tar に変換します。しかし、untar コマンドは何もしていないようで、ログや Unix コンソールにエラーや例外はありません。

Unix プロンプトで同じコマンドを実行すると、正常に動作します。

ノート:

  1. *.tar.gz を *.tar に変換するため、実行パスは正しいです
  2. 私のシステムでは属性「z」が機能しないため、「tar -zxvf fileName.tar.gz」を使用できません。
  3. エラーや例外はスローされません。

助けてください。

4

3 に答える 3

2

いくつかのこと:

  • tar コマンドは、作業ディレクトリに関連するファイルを展開します。これは、Java プロセス オブジェクトに対して設定する必要がある場合があります。
  • untar プロセスを開始する前に、unzip プロセスが完了するまで待つ必要があります。
  • プロセスからの出力ストリームを処理する必要があります。

これは、拡張/適応できる実際の例です。別のクラスを使用して、プロセス出力ストリームを処理します。

class StreamGobbler implements Runnable {
    private final Process process;

    public StreamGobbler(final Process process) {
        super();
        this.process = process;
    }

    @Override
    public void run() {
        try {
            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            reader.close();
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }
}

public void extractTarball(final File workingDir, final String archiveName)
        throws Exception {
    final String gzFileName = archiveName + ".tar.gz";
    final String tarFileName = archiveName + ".tar";

    final ProcessBuilder builder = new ProcessBuilder();
    builder.redirectErrorStream(true);
    builder.directory(workingDir);
    builder.command("gunzip", gzFileName);
    final Process unzipProcess = builder.start();

    new Thread(new StreamGobbler(unzipProcess)).start();
    if (unzipProcess.waitFor() == 0) {
        System.out.println("Unzip complete, now untarring");

        builder.command("tar", "xvf", tarFileName);
        final Process untarProcess = builder.start();
        new Thread(new StreamGobbler(untarProcess)).start();
        System.out.println("Finished untar process. Exit status "
                + untarProcess.waitFor());
    }
}
于 2013-04-11T06:09:30.527 に答える
0

問題は、私たちが提供するコマンドが UNIX コマンドであるため、Windows 環境では機能しないことです。この問題を解決するためのスクリプト ファイルを作成しました。ご協力いただきありがとうございます。Runtime.getRuntime.exec() は、指定されたコマンドを実行するのに時間がかかるため、各 exec() の後に thread.wait(3000) を指定してプロセスを完了し、次のスレッドに移動します。

于 2013-06-27T06:52:49.937 に答える
0

以下のコードは、実行されたコマンドの出力を出力します。エラーが返されるかどうかを確認します。

Process p = Runtime.getRuntime().exec("tar -xvf "+ fileName + ".tar");  
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));  
String line = null;  
while ((line = br.readLine()) != null) {  
     System.out.println(line);  
}
于 2013-04-11T04:51:16.360 に答える