当前位置: 首页 > 知识库问答 >
问题:

如何使用Apache Commons Compress将文件附加到. tar归档文件中?

朱睿
2023-03-14

我阅读了如何在java中将文件附加到tar存档?,将文件附加到存档而无需读取/重写整个存档,并在不覆盖其现有内容的情况下将条目添加到tar文件,但没有给出好的答案。此外,我没有足够的声誉来发表评论。所以我在这里创建了一个新问题。

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

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

    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);
    }
}

共有1个答案

顾文昌
2023-03-14

最后,我成功地使用这篇文章做到了这一点。

我创建了一个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创建一个tar归档文件。我有不断创建的文件,我希望工作线程从队列中引用这些文件并将其复制到存档中。 我尝试使用Apache Compression库的TarArchiveOutputStream来执行此操作,但是我不希望在程序的整个过程中都保持归档处于打开状态(因为除非最终确定归档文件,否则它可能会损坏- 因此,我宁愿将其追加到批处理),而我还没有找到一种很好的方法来通过

  • 问题内容: 如何在Go中将文件附加到现有的tar存档中?我没有在文档中看到任何明显的方法。 我有一个已经创建的tar文件,在关闭它之后,我想向它添加更多文件。 编辑 更改文档中的示例并遵循给出的答案,我仍然没有得到预期的结果。前三个文件正在写入tar,但是当我再次关闭并打开文件以对其进行写入时,永远不会写入新文件。代码运行正常。我不知道我在想什么。 以下代码为我提供了一个tar文件,其中包含三个文

  • 有没有办法将文件附加到MS Word文档中?我的意思与您将MS Excel文件拖放到MS Word中的方式相同。它显示MS Excel图标和文件名,双击打开附件。 我的情况来自以前的html文件,我导入使用XHTMLImporter.convert.现在超文本标记语言引用附件下载几个地方,并希望将这些文件附加到适当的MS Word文档。

  • 问题内容: 在Linux中将文本附加到文件的最简单方法是什么? 我看了这个问题,但是可接受的答案使用了一个附加程序(),我相信应该有一个更简单的方法或类似方法。 问题答案: cat >> filename This is text, perhaps pasted in from some other source. Or else entered at the keyboard, doesn’t

  • 问题内容: 我正在开发一个需要创建tar存档以计算其哈希值的应用程序。但是我遇到一些问题: tar在不同的机器上不一样,则计算出的哈希值不同 我无法正确添加目录 如果我在tar的最后添加一个zip文件,则我的zip文件中的内容不存在:/ 我已经阅读了SO中的不同文章以及有关apache的专用教程,还阅读了apache commons compress jar的源测试代码,但是我没有找到正确的解决方