如何使用 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 存档?的主要内容,如果未能解决你的问题,请参考以下文章
使用 apache common compress/org.tukaani.xz 在 java 中解码 LZMA 压缩 zip 文件的问题