Userentry = tarInput.getNextTarEntry()提示java.io.IOException Corrupted TAR archive ,java读取url,把下载连接下

文章介绍了在处理tar.gz文件时遇到CorruptedTARarchive错误的解决方法,通过使用ApacheCommonsCompress库下载和解压文件,并计算文件MD5以验证完整性。
摘要由CSDN通过智能技术生成

如果你在使用 TarArchiveInputStream 时遇到 "Corrupted TAR archive" 的错误,这可能是由于压缩包本身的问题或者在解析时发生错误。下面是一个使用 TarArchiveInputStream 解压 tar.gz 文件并计算文件的 MD5 的示例代码:

import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.compressors.CompressorInputStream;
import org.apache.commons.compress.compressors.CompressorStreamFactory;
import org.apache.commons.compress.utils.IOUtils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class TarGzProcessor {
    public static void main(String[] args) {
        String url = "http://18.0.0.9:8080/test/22.tar.gz";

        try {
            byte[] fileBytes = downloadFile(url);
            processTarGzInputStream(fileBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static byte[] downloadFile(String url) throws Exception {
        // 此处使用你的下载逻辑
        return null;
    }

    private static void processTarGzInputStream(byte[] fileBytes) throws Exception {
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileBytes);
             CompressorInputStream compressorInputStream = new CompressorStreamFactory().createCompressorInputStream(new ArchiveStreamFactory().createArchiveInputStream(ArchiveStreamFactory.TAR, byteArrayInputStream))) {

            ArchiveInputStream tarInput = new ArchiveStreamFactory().createArchiveInputStream(ArchiveStreamFactory.TAR, compressorInputStream);
            ArchiveEntry entry;

            while ((entry = tarInput.getNextEntry()) != null) {
                if (!entry.isDirectory()) {
                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                    IOUtils.copy(tarInput, byteArrayOutputStream);

                    byte[] fileContent = byteArrayOutputStream.toByteArray();
                    String md5 = calculateMD5(fileContent);

                    System.out.println("File: " + entry.getName() + ", MD5: " + md5);
                }
            }
        }
    }

    private static String calculateMD5(byte[] data) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(data);
        byte[] mdBytes = md.digest();

        // convert the byte to hex format
        StringBuilder sb = new StringBuilder();
        for (byte mdByte : mdBytes) {
            sb.append(Integer.toString((mdByte & 0xff) + 0x100, 16).substring(1));
        }

        return sb.toString();
    }
}

请注意,上述代码使用 CompressorStreamFactory 来识别并处理 .tar.gz 文件。确保在 Maven 项目中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-compress</artifactId>
        <version>1.21</version>
    </dependency>
</dependencies>

此外,确保下载的文件本身没有问题。如果问题仍然存在,可能需要考虑检查网络连接或确认文件是否损坏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值