gpt4 book ai didi

java - 如何使用 Apache Commons Compress 将文件附加到 .tar 存档?

转载 作者:搜寻专家 更新时间:2023-11-01 02:50:07 25 4
gpt4 key购买 nike

我读了How do I append files to a tar archive in java? , append files to an archive without reading/rewriting the whole archiveAdd an entry to a tar file without overwriting its existing contents但没有给出好的答案。此外,我没有足够的声誉来发表评论。所以我在这里创建了一个新问题。

有没有办法在 tar 存档中追加文件?如果文件已经存在,我想替换它。

我已经开始编写以下方法,但是当添加文件时,它会删除存档内容。我没有在 apache compress website 上找到任何示例.

    static final Logger LOG = Logger.getLogger(ShellClient.class);

public void appendFileInTarArchive(String tarPath, String tarFileName, String file2WriteName, String file2WriteContent) throws IOException {
if (tarPath == null || tarFileName == null || tarFileName.isEmpty()) {
LOG.warn("The path or the name of the tar archive is null or empty.");
return;
}
final File tarFile = new File(tarPath, tarFileName);
final File fileToAdd = new File(tarPath, file2WriteName);
FileUtils.write(fileToAdd, file2WriteContent);

if (file2WriteName == null || file2WriteName.isEmpty()) {
LOG.warn("The name of the file to append in the archive is null or empty.");
return;
}

TarArchiveOutputStream aos = null;
OutputStream out = null;

try {
out = new FileOutputStream(tarFile);

aos = (TarArchiveOutputStream) new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.TAR, out);

// create a new entry
final TarArchiveEntry entry = new TarArchiveEntry(fileToAdd);
entry.setSize(fileToAdd.length());

// add the entry to the archive
aos.putArchiveEntry(entry);
InputStream is = new FileInputStream(fileToAdd);
final int byteCopied = IOUtils.copy(is, aos);
if (LOG.isDebugEnabled()) {
LOG.debug(byteCopied+" bytes inserted in the tar archive from "+fileToAdd);
}
is.close();
aos.closeArchiveEntry();
aos.finish();
aos.flush();
aos.close();
out.flush();
out.close();

} catch (ArchiveException e) {
LOG.error(e.getMessage(), e);
} catch (IOException e) {
LOG.error(e.getMessage(), e);
} finally {
IOUtils.closeQuietly(aos);
IOUtils.closeQuietly(out);
FileUtils.deleteQuietly(fileToAdd);
}
}

最佳答案

最后我使用 this post 成功了.

我创建了 tar 存档的副本,并将全部内容复制到其中。然后我删除旧的 tar 存档。

public void appendFileInTarArchive(String tarPath, String tarFileName, String file2WriteName, String file2WriteContent) throws AuthenticationException, IOException {
if (tarPath == null || tarFileName == null || tarFileName.isEmpty()) {
LOG.warn("The path or the name of the tar archive is null or empty.");
return;
}
final File tarFile = new File(tarPath, tarFileName);
final File fileToAdd = new File(tarPath, file2WriteName);
FileUtils.write(fileToAdd, file2WriteContent);

if (file2WriteName == null || file2WriteName.isEmpty()) {
LOG.warn("The name of the file to append in the archive is null or empty.");
return;
}

ArchiveStreamFactory asf = new ArchiveStreamFactory();

File tempFile = new File(tarPath, "tmpTar.tar");
tempFile.createNewFile();

try {
FileInputStream fis = new FileInputStream(tarFile);
ArchiveInputStream ais = asf.createArchiveInputStream(ArchiveStreamFactory.TAR, fis);

FileOutputStream fos = new FileOutputStream(tempFile);
ArchiveOutputStream aos = asf.createArchiveOutputStream(ArchiveStreamFactory.TAR, fos);

// copy the existing entries
ArchiveEntry nextEntry;
while ((nextEntry = ais.getNextEntry()) != null) {
aos.putArchiveEntry(nextEntry);
IOUtils.copy(ais, aos);
aos.closeArchiveEntry();
}

// create the new entry
TarArchiveEntry entry = new TarArchiveEntry(file2WriteName);
entry.setSize(fileToAdd.length());
aos.putArchiveEntry(entry);
IOUtils.copy(new FileInputStream(fileToAdd), aos);
aos.closeArchiveEntry();

aos.finish();

ais.close();
aos.close();

// copies the new file over the old
tarFile.delete();
tempFile.renameTo(tarFile);

} catch (ArchiveException e) {
LOG.error(e.getMessage(), e);
} catch (IOException e) {
LOG.error(e.getMessage(), e);
} finally {
FileUtils.deleteQuietly(fileToAdd);
}
}

关于java - 如何使用 Apache Commons Compress 将文件附加到 .tar 存档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12890508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com