1

私は現在、ドライブのマウントとtar.gzファイルの抽出をすべてJavaで行うWebアプリケーションに取り組んでいます。アプリケーションはLinux環境で実行されるため、「mount」や「tar」などのUNIXコマンドを使用してみようと思いました。

Runtime runtime = Runtime.getRuntime();
Process proc;

String mountCommand = "mount -t cifs -o username=...";
String extractCommand = "tar xzf ..."

proc = runtime.exec(mountCommand);
proc.waitFor();

proc = runtime.exec(extractCommand);
proc.waitFor();

ターミナルでmountコマンドとextractコマンドを実行すると正常に機能しますが、Javaで最初に実行すると失敗します。2番目のproc.waitFor()は終了コード2を返します。ただし、最初の試行が失敗した後にこのコードを実行すると、正常に機能します。問題は、mountコマンドが完全に完了するまでwaitFor()が待機していないことだと感じています。コードに重要なものが欠けていますか?

また、これはすべてJavaで実行したいのですが、ファイルを解凍する方法を理解するのに非常に苦労したので、このアプローチを採用しています。(ああ、誰かがこれを行う方法を教えてくれるなら、私はとても幸せになるでしょう)。どんな提案でもmuuuuuuuuuuchに感謝します!

4

5 に答える 5

4

進歩して。誰かが疑問に思っている場合に備えて、Java で tar.gz ファイルを抽出する方法を次に示します。いくつかのオンライン チュートリアルからまとめます。

public static void extract(String tgzFile, String outputDirectory)
    throws Exception {

// Create the Tar input stream.
FileInputStream fin = new FileInputStream(tgzFile);
GZIPInputStream gin = new GZIPInputStream(fin);
TarInputStream tin = new TarInputStream(gin);

// Create the destination directory.
File outputDir = new File(outputDirectory);
outputDir.mkdir();

// Extract files.
TarEntry tarEntry = tin.getNextEntry();
while (tarEntry != null) {
    File destPath = new File(outputDirectory + File.separator + tarEntry.getName());

    if (tarEntry.isDirectory()) {
    destPath.mkdirs();
    } else {
    // If the parent directory of a file doesn't exist, create it.
    if (!destPath.getParentFile().exists())
        destPath.getParentFile().mkdirs();

    FileOutputStream fout = new FileOutputStream(destPath);
    tin.copyEntryContents(fout);
    fout.close();
    // Presserve the last modified date of the tar'd files.
    destPath.setLastModified(tarEntry.getModTime().getTime());
    }
    tarEntry = tin.getNextEntry();
}
tin.close();
}
于 2009-07-09T17:35:43.477 に答える
3

素早い回答

外部コマンドへの依存が存在するため、次のように簡略化します。

#!/bin/bash
mount -t cifs -o username=...
tar xzf ...

名前を付けてmount-extract.shから、1 回の呼び出しでRuntime.exec()呼び出します。

半統合回答

Java API を使用します。

Runtime.execmount コマンドを実行する必要があります。

前向きに

Java はクロスプラットフォームのソフトウェア開発ツールであるため、アプリケーションのマウント コマンドを抽象化して、基盤となるオペレーティング システムに基づいて動的に派生させることを検討してください。

参照: Java で Windows ドライブをマウントするにはどうすればよいですか?

参照: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()

もちろん、アジャイル開発では、必要になるまでこれを行わないように主張します。そのため、それまでは頭の片隅に置いておいてください (Unix ベースのシステム以外でアプリケーションを実行することはないかもしれません)。

于 2009-07-08T23:39:38.253 に答える
0

Ant コードベースのorg.apache.tools.tarパッケージを見てください。そのパッケージには、tar アーカイブの読み取りに使用できるTarInputStreamというクラスがあります。

于 2009-07-08T23:31:32.760 に答える
0

メソッドの呼び出し方法に関連している可能性があります。

この回答を参照してください

基本的に使ってみてください

.exec( String [] command );

それ以外の

.exec( String command );

2回目に実行されると述べているため、関連しているかどうかはわかりません。試してみて、お知らせください。

于 2009-07-08T23:31:46.973 に答える
0

これはすべて Java で実行できますが、ネイティブ プロセスを扱う場合は注意が必要です。

開始したプロセスに必要な実際の作業を行う子プロセスがある場合、waitFor() コマンドは、親プロセスが終了したときに戻るため、十分な時間を与えていない可能性があります。終了する子プロセス。

これを回避する 1 つの方法は、いくつかのテストをループして、開始したネイティブ プロセスが満足のいく形で終了したことを確認することです。この場合、おそらく java.io.File が存在するかどうかを確認します。

于 2009-07-08T23:37:19.270 に答える