我正在使用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
打开。假设您有足够的虚拟内存,该文件将被内存映射,使随机访问非常快(我还没有看到如果无法内存映射,它是否会使用随机访问文件)。