我正在使用TarInputStream()来读取tar文件的内容并将其中的所有文件存储在特定位置。我想创建一个名称类似于tar文件的文件夹,并将我的所有文件保存在该文件夹中。例如,如果我有一个tar文件test.tar.gz,其中包含文件test1和test2,我的代码应该通过名称test创建一个文件夹并将tar文件解压缩到该文件夹。
这是我写的代码。
TarInputStream tin = new TarInputStream(new GZIPInputStream(new FileInputStream(new File(tarFileName))));
TarEntry tarEntry = tin.getNextEntry();
while (tarEntry != null) {// create a file with the same name as tar entry
File destPath = new File(dest.toString() + File.separatorChar
+ tarEntry.getName());
FileOutputStream fout = new FileOutputStream(destPath);
tin.copyEntryContents(fout);
fout.close();
///services/advert/lpa/dimenions/data/advertiser/
Path inputFile = new Path(destPath.getAbsolutePath());
//To remove the local files set the flag to true
fs.copyFromLocalFile(inputFile, filenamepath);
tarEntry = tin.getNextEntry();
}
答案 0 :(得分:1)
我将您的new File(...)
更改为new File(dest, tarEntry.getName());
(假设dest
为File
- 无法查看代码中的来源。)
最重要的是,您需要确保创建正在尝试创建文件的目录。这可以通过以下方式完成:
destPath.getParent().mkdirs();
.getParent()
很重要,因为我们无法为文件名的每个部分创建文件夹,否则文件名也会被创建为文件夹而不是文件,然后尝试将数据写入它会失败(因为预期文件而不是存在的文件夹)。
从lpa_1_454_20111117011749
:
lpa_1_454_20111117011749.tar.gz
名称
String tarFileName = "/tmp/lpa_1_454_20111117011749.tar.gz";
// Non-regular expression approach:
{
int lastPath = tarFileName.lastIndexOf('/');
if(lastPath >= 0){
lastPath++;
}
int endName = tarFileName.length();
if(tarFileName.endsWith(".tar.gz")){
endName -= 7;
}
String baseName = tarFileName.substring(lastPath, endName);
System.out.println(baseName);
}
// Regular expression approach:
{
Pattern p = Pattern.compile("(?:.*/|^)(.*)\\.tar\\.gz");
Matcher m = p.matcher(tarFileName);
if(m.matches()){
System.out.println(m.group(1));
}
}
接近输出:
lpa_1_454_20111117011749