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

向tar文件中添加条目而不覆盖其现有内容

慎望
2023-03-14
public static void injectFileToTar () throws IOException, ArchiveException {
        String agentSourceFilePath = "C:\\Work\\tar.gz\\";
        String fileToBeAdded = "activeSensor.cfg";
        String unzippedFileName = "sample.tar";

    File f2 = new File(agentSourceFilePath+unzippedFileName); // Refers to the .tar file
    File f3 = new File(agentSourceFilePath+fileToBeAdded);    // The new entry to be added to the .tar file

    // Injecting an entry in the tar
    OutputStream tarOut = new FileOutputStream(f2);
    TarArchiveOutputStream aos = (TarArchiveOutputStream) new  ArchiveStreamFactory().createArchiveOutputStream("tar", tarOut);
    TarArchiveEntry entry = new TarArchiveEntry(fileToBeAdded);
    entry.setMode(0100000);
    entry.setSize(f3.length());
    aos.putArchiveEntry(entry);
    FileInputStream fis = new FileInputStream(f3);
    IOUtils.copy(fis, aos);
    fis.close();
    aos.closeArchiveEntry();
    aos.finish();
    aos.close();
    tarOut.close(); 

}

在检查tar时,只找到“activesensor.cfg”文件,并且发现缺少tar的初始内容。是否“模式”设置不正确?

共有1个答案

班浩皛
2023-03-14

问题是TarchiveOutputStream不会自动读取现有的存档文件,这是您需要做的。类似于:

CompressorStreamFactory csf = new CompressorStreamFactory();
ArchiveStreamFactory asf = new ArchiveStreamFactory();

String tarFilename = "test.tgz";
String toAddFilename = "activeSensor.cfg";
File toAddFile = new File(toAddFilename);
File tempFile = File.createTempFile("updateTar", "tgz");
File tarFile = new File(tarFilename);

FileInputStream fis = new FileInputStream(tarFile);
CompressorInputStream cis = csf.createCompressorInputStream(CompressorStreamFactory.GZIP, fis);
ArchiveInputStream ais = asf.createArchiveInputStream(ArchiveStreamFactory.TAR, cis);

FileOutputStream fos = new FileOutputStream(tempFile);
CompressorOutputStream cos = csf.createCompressorOutputStream(CompressorStreamFactory.GZIP, fos);
ArchiveOutputStream aos = asf.createArchiveOutputStream(ArchiveStreamFactory.TAR, cos);

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

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

aos.finish();

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

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

几个注意事项:

  • 此代码不包括任何异常处理(请添加适当的try-catch-finally块)
  • 此代码不处理大小超过2147483647(integer.max_value)的文件,因为它只读取文件大小到整数精度字节(请参阅转换为int)。不过,这不是问题,因为Apache Compress无论如何也不会处理超过2 GB文件。
 类似资料:
  • 问题内容: 目前,我有一个循环,试图通过在文件名字符串中添加后缀来查找未使用的文件名。一旦找不到文件,它将使用无法以该名称打开新文件的名称。问题在于此代码用于网站中,并且可能多次尝试同时执行同一操作,因此存在竞争条件。 如果在检查时间和另一个线程中的打开时间之间创建了一个文件,如何防止python覆盖现有文件。 我可以通过将后缀随机化来最小化机会,但是根据路径名的各个部分,机会已经被最小化了。我想

  • 问题内容: 我正在尝试编写一种方法(如果尚不存在),然后制作一个“ log.txt文件”,然后将其写入该文件。我遇到的问题是每次调用该方法时,它都会覆盖现有的日志。如何更改方法,以使它不会覆盖数据而是仅更新文件? 我的写入文件方法: 问题答案: 只需更改为

  • 问题内容: 我想知道是否可以创建多个具有相似名称的文件,而不会覆盖当前文件。 例如:如果我有一个文件:下次创建时xyz.txt应该是:xyz(1).txt 因此,如果我重新运行该程序,则当前文件不会被覆盖。我已经尝试过,如果带有标志变量的条件将数字添加为文件名的前缀。 我想知道是否有任何Java命令来避免覆盖现有文件。 问题答案: 我想知道是否有任何本地Java命令停止覆盖[并将数字添加到文件名中

  • 问题内容: 我有一个tar文件,其中包含许多文件。我需要编写一个python脚本,该脚本将读取文件的内容并提供总数字符的计数,包括字母,空格,换行符的总数,所有内容,而无需解压缩tar文件。 问题答案: 您可以使用 之后,您可以用来将成员提取为文件对象。只是一个例子 对于上面示例中的文件对象,可以使用,等等。

  • 然后将这个变量添加到arrayList,我在程序中调用WriteToFile()方法。 AddBookDialog类的代码 WriteFile类的代码 相反,当我尝试向该文件写入另一本书时,它反而覆盖了第一行 哈姆雷特:威廉莎士比亚:企鹅:FIC Shak:23 //《哈利·波特》的书中详细内容已被改写

  • 问题内容: with open(“games.txt”, “w”) as text_file: print(driver.current_url) text_file.write(driver.current_url + “\n”) 我现在正在使用此代码,但是当它写入文件时,它将覆盖旧内容。我如何能简单地添加它而不删除已经存在的内容。 问题答案: 而不是使用(附加)功能模式: