使用apache commons从tar解压缩文件 - prob是重复条目

时间:2013-03-11 20:10:24

标签: java tar apache-commons

场景:使用Apache commons解压缩tar文件。

问题:我正在使用的tar是一个构建tar,它被部署到Web服务器中。此tar包含重复的条目,如下所示。

  1. appender_class.xml
  2. APPENDER_CLASS.xml
  3. 使用下面的代码解压缩时,只提取了appender_class.xml,但我想要这两个文件,我该怎么做?在fly中重命名很好,但我怎么能实现呢?

    public static void untar(File[] files) throws Exception {
            String path = files[0].toString();
            File tarPath = new File(path);
            TarEntry entry;
            TarInputStream inputStream = null;
            FileOutputStream outputStream = null;
            try {
                inputStream = new TarInputStream(new FileInputStream(tarPath));
                while (null != (entry = inputStream.getNextEntry())) {
                    int bytesRead;
                    System.out.println("tarpath:" + tarPath.getName());
                    System.out.println("Entry:" + entry.getName());
                    String pathWithoutName = path.substring(0, path.indexOf(tarPath.getName()));
                    System.out.println("pathname:" + pathWithoutName);
                    if (entry.isDirectory()) {
                        File directory = new File(pathWithoutName + entry.getName());
                        directory.mkdir();
                        continue;
                    }
                    byte[] buffer = new byte[1024];
                    outputStream = new FileOutputStream(pathWithoutName + entry.getName());
                    while ((bytesRead = inputStream.read(buffer, 0, 1024)) > -1) {
                        outputStream.write(buffer, 0, bytesRead);
                    }
                    System.out.println("Extracted " + entry.getName());
                }
        }
    

1 个答案:

答案 0 :(得分:2)

尝试打开这样的FileOutputstream:

File outputFile = new File(pathWithoutName + entry.getName());
for(int i = 2; outputFile.exists(); i++) {
    outputFile = new File(pathWithoutName + entry.getName() + i);
}
outputStream = new FileOutputStream(outputFile);

如果遇到先前创建的名为APPENDER_CLASS.xml的文件,它应该生成一个名为APPENDER_CLASS.xml2的文件。如果存在APPENDER_CLASS.xml2,它将无限制地创建APPENDER_CLASS.xml3。

File.exists()考虑了区分大小写(Windows文件名不区分大小写,而unix,linux和mac区分大小写)。因此,对于不区分大小写的文件系统上面的代码,文件将被重命名,而在区分大小写的文件系统上,文件将不会被重命名。