在java中没有父文件夹的文件夹下的tar文件

时间:2014-04-18 09:02:58

标签: java archive tar

我在c:\ Docs \ Desktop

下有以下文件结构
rootFolder
|_x1
  |_1.png
  |_2.png
|_x2

我必须遍历rootFolder(x1,x2 ... xN)的子文件夹并创建保存它们的tar文件。所以x1.tar应该有1.png和2.png

for(String folder: rootFolder.list()) {
    File files = new File(rootFolder.getAbsolutePath() + "\\" + folder);
    for(File subfiles : files.listFiles()) {
        fileList.add(subfiles);
    }
    generateTar(fileList,files.getAbsolutePath() + ".tar");
}

我在generateTar方法中使用org.apache.commons.compress.archivers

generateTarFile(List<File> fileList, String tarName) {

    File tarFile = new File(tarName);
    OutputStream out = new FileOutputStream(tarFile);

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

    for(File file : fileList) {
        TarArchiveEntry entry = new TarArchiveEntry(file);
        entry.setSize(file.length());
        aos.putArchiveEntry(entry);
        IOUtils.copy(new FileInputStream(file), aos);
        aos.closeArchiveEntry();
    }

    aos.finish();
    aos.close();
    out.close();
}

此方法创建一个具有相同文件夹名称的tar文件(例如rootFolder下的x1.tar),但x1.tar具有以下结构

x1.tar
|_Docs
  |_Desktop
    |_rootFolder
      |_x1
        |_1.png
        |_2.png

而不是

x1.tar
|_1.png
|_2.png

我怎样才能实现它?

2 个答案:

答案 0 :(得分:0)

如果使用除文件之外还接受名称的TarArchiveEntry构造函数,则可以设置条目的名称。但这意味着您无法仅从文件列表生成tar:在您遍历目录树时,您需要以某种方式保存相对路径,或者在创建条目时计算相对路径。

答案 1 :(得分:0)

您可以在创建条目时使用文件名来实现此目的:

TarArchiveEntry entry = new TarArchiveEntry(file.getName());