1

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

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

  1. appender_class.xml
  2. APPENDER_CLASS.xml

使用以下代码提取时,仅提取 appender_class.xml 但我想要这两个文件我该怎么做?在飞行中重命名很好,但我怎么能做到这一点?

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

1 回答 1

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 区分大小写)。因此,在不区分大小写的文件系统上使用上面的代码,文件将被重命名,而在区分大小写的文件系统上,文件不会被重命名。

于 2013-03-11T22:26:32.350 回答