如何使用apache commons从TAR解压特定文件



我正在使用Apache Commons 1.4.1库来解压缩".tar"文件。

问题:我不需要提取所有文件。我必须从tar存档中的特定位置提取特定的文件。我必须提取只有几个。xml文件,其中作为TAR文件的大小约为300 MB &解压缩整个内容是浪费资源。

我很高傲&困惑我是否必须做一个嵌套的目录比较,或者有其他的方法吗?

注意:. xml(必需文件)的位置总是相同的。

TAR的结构为:

directory:E:Rootdata
 file:E:Rootdatasheet.txt
directory:E:Rootmap
     file:E:Rootmapers.txt
directory:E:Rootui
     file:E:Rootuicapital.txt
     file:E:Rootuiinfo.txt
directory:E:Rootuisales
     file:E:RootuisalesReqest_01.xml
     file:E:RootuisalesReqest_02.xml
     file:E:RootuisalesReqest_03.xml
     file:E:RootuisalesReqest_04.xml
directory:E:Rootuisalesstores
directory:E:Rootuistores
directory:E:Rooturls
directory:E:Rooturlsfullfilment
     file:E:RooturlsfullfilmentCams_01.xml
     file:E:RooturlsfullfilmentCams_02.xml
     file:E:RooturlsfullfilmentCams_03.xml
     file:E:RooturlsfullfilmentCams_04.xml
directory:E:Rooturlsfullfilmentprofile
directory:E:Rooturlsfullfilmentregistration
     file:E:Rooturlsoptions.txt
directory:E:Rooturlsprofile

约束: i cannot use JDK 7 &必须坚持使用Apache commons库。

我当前的解决方案:

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

TAR文件格式被设计为作为流(即,到磁带机/从磁带机)写入或读取,并且没有集中的头。所以,没有办法读取整个文件来提取单个条目。

如果您希望随机访问,您应该使用ZIP格式,并使用JDK的ZipFile打开。假设您有足够的虚拟内存,该文件将被内存映射,使随机访问非常快(我还没有看到如果无法内存映射,它是否会使用随机访问文件)。

相关内容

  • 没有找到相关文章

最新更新