【问题标题】:How to append files to a .tar archive using Apache Commons Compress?如何使用 Apache Commons Compress 将文件附加到 .tar 存档?
【发布时间】:2012-10-05 02:59:59
【问题描述】:

我阅读了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,但没有给出好的答案。此外,我没有足够的声誉来发布 cmets。所以我在这里创建了一个新问题。

有没有办法在 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);
    }
}

【问题讨论】:

    标签: java compression archive tar apache-commons-compress


    【解决方案1】:

    最后我使用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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 2012-07-10
      相关资源
      最近更新 更多