gpt4 book ai didi

java - 使用 Apache Commons Compress 解压缩 tar 文件

转载 作者:行者123 更新时间:2023-11-30 06:23:11 28 4
gpt4 key购买 nike

我正在使用 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 中的所有条目。

你能帮我理解我做错了什么吗?

最佳答案

来自官方文档
从 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(只有一个文本条目)。
不知道确切的要求,我只是解决了避免空指针读取文件的问题。调试,入口可用,你也找到了

    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 进行了测试(您也可以尝试使用这种方法来验证代码)以确保避免出现空值。
您需要根据您的实际需要进行所有必要的调整。很明显,您必须按照我在顶部发布的元代码中的方式处理流。
它显示了如何处理单个条目。

关于java - 使用 Apache Commons Compress 解压缩 tar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557613/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com