7

ApacheCommons1.4.1ライブラリを使用して".tar.gz"ファイルを圧縮および解凍しています。

最後のビットで問題が発生しています-aを。に変換TarArchiveInputStreamFileOutputStreamます。

奇妙なことに、それはこの線を破っています:

FileOutputStream fout = new FileOutputStream(destPath);

destPathは、次の正規パスを持つファイルです:C:\ Documents and Settings \ Administrator \ My Documents \ JavaWorkspace \ BackupUtility \ untarred \ Test \ subdir \ testinsub.txt

生成されたエラー:

Exception in thread "main" java.io.IOException: The system cannot find the path specified

それが何であるかについて何か考えはありますか?そして、なぜそれは道を見つけることができないのですか?

以下にメソッド全体を添付します(ほとんどはここから削除されます)。

private void untar(File dest) throws IOException {
    dest.mkdir();
    TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
    // tarIn is a TarArchiveInputStream
    while (tarEntry != null) {// create a file with the same name as the tarEntry
        File destPath = new File(dest.toString() + System.getProperty("file.separator") + tarEntry.getName());
        System.out.println("working: " + destPath.getCanonicalPath());
        if (tarEntry.isDirectory()) {
            destPath.mkdirs();
        } else {
            destPath.createNewFile();
            FileOutputStream fout = new FileOutputStream(destPath);
            tarIn.read(new byte[(int) tarEntry.getSize()]);
            fout.close();
        }
        tarEntry = tarIn.getNextTarEntry();
    }
    tarIn.close();
}
4

2 に答える 2

17

プログラムにJavaヒープスペースエラーがあります。少し変更が必要だと思います。ここにコードがあります...

public static void uncompressTarGZ(File tarFile, File dest) throws IOException {
    dest.mkdir();
    TarArchiveInputStream tarIn = null;

    tarIn = new TarArchiveInputStream(
                new GzipCompressorInputStream(
                    new BufferedInputStream(
                        new FileInputStream(
                            tarFile
                        )
                    )
                )
            );

    TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
    // tarIn is a TarArchiveInputStream
    while (tarEntry != null) {// create a file with the same name as the tarEntry
        File destPath = new File(dest, tarEntry.getName());
        System.out.println("working: " + destPath.getCanonicalPath());
        if (tarEntry.isDirectory()) {
            destPath.mkdirs();
        } else {
            destPath.createNewFile();
            //byte [] btoRead = new byte[(int)tarEntry.getSize()];
            byte [] btoRead = new byte[1024];
            //FileInputStream fin 
            //  = new FileInputStream(destPath.getCanonicalPath());
            BufferedOutputStream bout = 
                new BufferedOutputStream(new FileOutputStream(destPath));
            int len = 0;

            while((len = tarIn.read(btoRead)) != -1)
            {
                bout.write(btoRead,0,len);
            }

            bout.close();
            btoRead = null;

        }
        tarEntry = tarIn.getNextTarEntry();
    }
    tarIn.close();
} 

幸運を

于 2013-01-08T09:13:14.533 に答える
5

いくつかの一般的なポイント、なぜコンストラクターでブードゥーを行うFileのですか?作成したい名前を定義して親ファイルを与えることができる完全に使用可能なコンストラクターがありますか?File

第二に、ウィンドウのパスで空のスペースがどのように処理されるのかよくわかりません。それはあなたの問題の原因かもしれません。上記のコンストラクターを使用してみて、違いが生じるかどうかを確認してください:(これが適切なファイルであり、存在し、ユーザーがアクセスできるとFile destPath = new File(dest, tarEntry.getName());仮定します。File dest

第三に、オブジェクトを操作する前に、Fileオブジェクトが存在するかどうか、およびオブジェクトにアクセスできるかどうかを確認する必要があります。それは最終的に問題を特定するのに役立ちます。

于 2012-07-11T11:43:44.077 に答える