7

我正在使用 Apache Commons 1.4.1 库来压缩和解压缩".tar.gz"文件。

最后一点我遇到了麻烦 - 将 aTarArchiveInputStream转换为FileOutputStream.

奇怪的是,它打破了这条线:

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你想要创建的名称并给一个父文件?

其次,我不太确定 Windows 路径中的空格是如何处理的。这可能是您的问题的原因。尝试使用我上面提到的构造函数,看看它是否有所作为:(File destPath = new File(dest, tarEntry.getName());假设这File dest是一个正确的文件,并且存在并且您可以访问。

第三,在对File对象进行任何操作之前,您应该检查它是否存在以及是否可以访问。这最终将帮助您查明问题。

于 2012-07-11T11:43:44.077 回答