Apache Commons 解压:getNextTarEntry 的 IllegalArgumentException
-
10-12-2019 - |
题
我遇到了问题 压缩apache库. 。我想解压包含二进制文件的存档。这是代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
public class ArchiveManager {
public static final int BUFFER_MAX = 2048;
public static void untar(String fileName, String targetPath) throws IOException {
File tarArchiveFile = new File(fileName);
BufferedOutputStream dest = null;
FileInputStream tarArchiveStream = new FileInputStream(tarArchiveFile);
TarArchiveInputStream tis = new TarArchiveInputStream(new BufferedInputStream(tarArchiveStream));
TarArchiveEntry entry = null;
try {
while ((entry = tis.getNextTarEntry()) != null) {
int count;
File outputFile = new File(targetPath, entry.getName());
if (entry.isDirectory()) { // entry is a directory
if (!outputFile.exists()) {
outputFile.mkdirs();
}
} else { // entry is a file
byte[] data = new byte[BUFFER_MAX];
FileOutputStream fos = new FileOutputStream(outputFile);
dest = new BufferedOutputStream(fos, BUFFER_MAX);
while ((count = tis.read(data, 0, BUFFER_MAX)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
}
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if (dest != null) {
dest.flush();
dest.close();
}
tis.close();
}
}
}
解压二进制文件时, getNextTarEntry()
抛出异常:
java.lang.IllegalArgumentException: Invalid byte 111 at offset 0 in 'o.txt{NUL}{NUL}{NUL}' len=8
at org.apache.commons.compress.archivers.tar.TarUtils.parseOctal(TarUtils.java:99)
at org.apache.commons.compress.archivers.tar.TarArchiveEntry.parseTarHeader(TarArchiveEntry.java:786)
at org.apache.commons.compress.archivers.tar.TarArchiveEntry.<init>(TarArchiveEntry.java:308)
at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:198)
at com.airbus.pakito.download.ArchiveManager.untar(ArchiveManager.java:22)
我尝试解压简单的文本文件。解开最后一个文件后, getNextTarEntry()
不返回 null,而是返回一个具有空字段的对象。所以 entry.getName()
是空的并且显然 new FileOutputStream(outputFile)
无法创建文件。
java.io.FileNotFoundException: C:\Temp (Accès refusé)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at com.airbus.pakito.util.Archive.untar(Archive.java:32)
您知道问题从何而来吗?
谢谢。
不隶属于 StackOverflow