如何使用 Java(apache 压缩)在 Windows 中创建“有效”的 unix TAR 存档?

Posted

技术标签:

【中文标题】如何使用 Java(apache 压缩)在 Windows 中创建“有效”的 unix TAR 存档?【英文标题】:How do i create a "valid" unix TAR Archive in Windows with Java (apache compress)? 【发布时间】:2013-07-01 14:36:04 【问题描述】:

我正在尝试使用 apache commons compress 库创建一个“有效”的 tar.gz 存档。创建的存档将由嵌入式设备读取,并且我认为必须具有相同的格式和相同的文件权限。

如果我使用 Linux 创建文件,一切正常,但如果我使用 Windows。文件被拒绝。

如您所见,存档仅包含具有 unix 权限的特殊文件。这些设置正确,如果我使用“工作”tar 文件并通过 gzip 运行它,则创建的 tar.gz 也可以正常工作。

我发现的唯一区别是,非工作 tar 文件稍大(61 而不是 56 kb)并且 7zip 显示在“主机操作系统”FAT 而不是 Unix .

任何想法,我如何从 Windows 创建一个“真正的”tar 存档?

提前致谢!

我目前的源码是:

public static void compress(File configTar, File rcConf, File databaseTxt)
        throws ArchiveException, IOException 

    OutputStream tarFileStream = new GZIPOutputStream(new FileOutputStream(configTar));
    InputStream rcConfStream = new FileInputStream(rcConf);
    InputStream databaseTxtStream = new FileInputStream(databaseTxt);

    ArchiveOutputStream archiveOutputStream = new ArchiveStreamFactory()
            .createArchiveOutputStream(ArchiveStreamFactory.TAR, tarFileStream);

    TarArchiveEntry databaseTxtEntry = new TarArchiveEntry(databaseTxt);
    TarArchiveEntry rcConfEntry = new TarArchiveEntry(rcConf);

    databaseTxtEntry.setName("database.txt");
    databaseTxtEntry.setGroupName("root");
    databaseTxtEntry.setUserName("root");
    databaseTxtEntry.setMode(convertModeFromString("rwxr-xr-x"));

    archiveOutputStream.putArchiveEntry(databaseTxtEntry);
    IOUtils.copy(databaseTxtStream, archiveOutputStream);
    archiveOutputStream.closeArchiveEntry();

    rcConfEntry.setName("rc.conf");
    rcConfEntry.setGroupName("root");
    rcConfEntry.setUserName("root");
    rcConfEntry.setMode(convertModeFromString("rw-rw-rw-"));

    archiveOutputStream.putArchiveEntry(rcConfEntry);
    IOUtils.copy(rcConfStream, archiveOutputStream);
    archiveOutputStream.closeArchiveEntry();

    archiveOutputStream.finish();

    rcConfStream.close();
    databaseTxtStream.close();
    tarFileStream.close();

我进行了一些研究,发现 TAR 标头之间存在差异。谁能告诉我,我做错了什么?

Working example of file 1:
   http://i.stack.imgur.com/S8Rbi.jpg

NON-Working example of file 1:
   http://i.stack.imgur.com/bdc9T.jpg

Working example of file 2:
   http://i.stack.imgur.com/rYhr9.jpg

NON-Working example of file 2:
   http://i.stack.imgur.com/4wHw3.jpg

【问题讨论】:

【参考方案1】:

您需要使用不同的构造函数。我你检查JavaCodeTarArchiveEntry

new TarArchiveEntry(file) 最终会变成new TarArchiveEntry(file, file.getPath())

所以,如果你使用new TarArchiveEntry(file, file.getName()),它会变平

【讨论】:

以上是关于如何使用 Java(apache 压缩)在 Windows 中创建“有效”的 unix TAR 存档?的主要内容,如果未能解决你的问题,请参考以下文章

win11如何解压缩压缩包?

使用 apache common compress/org.tukaani.xz 在 java 中解码 LZMA 压缩 zip 文件的问题

如何在Win10里使用命令行来压缩/解压缩文件

如何在 Apache 2.x 中使用 mod_deflate 预压缩文件?

搭建Java环境如何解压缩

健忘随发 win10下部署Apache+php+mysql