tar からファイルを抽出するために、ここの別の投稿の apache commons compress の例を使用していますが、次のように失敗しています:
java.io.IOException: Invalid file path.
これは、私が渡している一部の vmware ova ファイル (これは tar ファイルです) でのみ発生しますが、すべての ova ファイルでは発生しません。他の人は正常に動作します。
コードは次のとおりです。
public static void unTar(File tarFile, File dest) throws IOException {
dest.mkdir();
TarArchiveInputStream tarIn = null;
tarIn = new TarArchiveInputStream(
new BufferedInputStream(
new FileInputStream(
tarFile
)
)
);
TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
// tarIn is a TarArchiveInputStream
while (tarEntry != null) {// create a file with the same name as the tarEntry
File destPath = new File(dest, tarEntry.getName());
System.out.println("working: " + destPath.getCanonicalPath());
if (tarEntry.isDirectory()) {
destPath.mkdirs();
} else {
destPath.createNewFile();
byte [] btoRead = new byte[1024];
BufferedOutputStream bout =
new BufferedOutputStream(new FileOutputStream(destPath));
int len = 0;
while((len = tarIn.read(btoRead)) != -1)
{
bout.write(btoRead,0,len);
}
bout.close();
btoRead = null;
}
tarEntry = tarIn.getNextTarEntry();
}
tarIn.close();
}
問題は、destFile の値を設定しようとする時点で tarEntry.getName() に導入されたようです。デバッガーでそれをステップ実行すると、destPath は余分な表示できない文字と、パス内の「someone」という単語を取得しています。
target/mybuildname-SNAPSHOT/extractedDirectory/<garbage characters>someone/test.ovf
正常に untar できる ova ファイルの場合、desPath の値は正常に見えます。
target/mybuildname-SNAPSHOT/extractedDirectory/test.ovf
hexdump -C で表示すると、両方の tar (ova) ファイル ヘッダーにこのテキストが表示されるため、「someone」テキストは適切な手がかりになります。ただし、それらは同じ場所にありません。
ここでの解決策は、ファイル名が保存されているオフセットを特定し、その特定のオフセットから読み取ることに関係していると思います。それは私の最善の推測ですが、16進数を読むのはあまり得意ではありません。
私の目標は ova 内の ovf xml ファイルを読み取ることであり、ova の作成を制御していないことに注意することが重要です...そのため、事前にヘッダーの問題を修正することはできません。ova ファイル自体は完全に機能しており、tar -xvf test.ova を使用してコマンド ラインから正常に解凍することもできます。実際、コマンド ラインから tar ファイルを再パッケージ化すると、上記のコードが機能します。