我正在使用Apache Commons Compress创建tar存档并解压缩它们。我的问题从这个方法开始:
private void decompressFile(File file) throws IOException {
logger.info("Decompressing " + file.getName());
BufferedOutputStream outputStream = null;
TarArchiveInputStream tarInputStream = null;
try {
tarInputStream = new TarArchiveInputStream(
new FileInputStream(file));
TarArchiveEntry entry;
while ((entry = tarInputStream.getNextTarEntry()) != null) {
if (!entry.isDirectory()) {
File compressedFile = entry.getFile();
File tempFile = File.createTempFile(
compressedFile.getName(), "");
byte[] buffer = new byte[BUFFER_MAX_SIZE];
outputStream = new BufferedOutputStream(
new FileOutputStream(tempFile), BUFFER_MAX_SIZE);
int count = 0;
while ((count = tarInputStream.read(buffer, 0, BUFFER_MAX_SIZE)) != -1) {
outputStream.write(buffer, 0, count);
}
}
deleteFile(file);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
}
}
每次运行代码时,compressedFile变量都为null,但是while循环遍历测试tar中的所有条目。
你能帮我理解我做错了吗?
答案 0 :(得分:3)
来自官方文件
从tar档案中读取条目:
TarArchiveEntry entry = tarInput.getNextTarEntry();
byte[] content = new byte[entry.getSize()];
LOOP UNTIL entry.getSize() HAS BEEN READ {
tarInput.read(content, offset, content.length - offset);
}
我已经从您的实现和测试开始编写了一个示例,其中包含一个非常简单的.tar(只有一个文本条目)。
不知道确切的要求我只是负责解决读取存档的问题,避免使用nullpointer。调试时,您也可以找到该条目
private static void decompressFile(File file) throws IOException {
BufferedOutputStream outputStream = null;
TarArchiveInputStream tarInputStream = null;
try {
tarInputStream = new TarArchiveInputStream(
new FileInputStream(file));
TarArchiveEntry entry;
while ((entry = tarInputStream.getNextTarEntry()) != null) {
if (!entry.isDirectory()) {
File compressedFile = entry.getFile();
String name = entry.getName();
int size = 0;
int c;
while (size < entry.getSize()) {
c = tarInputStream.read();
System.out.print((char) c);
size++;
}
(.......)
正如我所说:我使用tar测试,只包含一个文本条目(您也可以尝试这种方法来验证代码),以确保避免使用null。
您需要根据实际需要进行所有必要的调整。
很明显,您必须处理流,就像我在顶部发布的元代码一样
它显示了如何处理单个条目。
答案 1 :(得分:2)
尝试使用getNextEntry()方法而不是getNextTarEntry()方法。
第二种方法返回TarArchiveEntry。可能这不是你想要的!