使用输入/输出流的 Java LZ4 压缩

标签 java lz4

我正在使用 jpountz LZ4 尝试压缩文件,我想使用 Java 文件输入和输出流读入和输出文件。我试图在网上找到解决方案,但一无所获,我发现了一个关于如何正确实现 LZ4 的先前 stackoverflow 问题,我已经接受并尝试修改它以使用流,但我不确定这是否是正确或者它是否有效。

在文本文件上运行压缩时,它会输出一个缺少某些字符或用符号替换的文件

ðHello world Heðo world Hello ðrld Hello worlðHello worl

但是在使用图像文件运行它时会抛出越界错误。我也无法使解压缩工作,因为它会抛出输入缓冲区的错误解码偏移量 3。

这是我的代码,如有帮助,将不胜感激

public void LZ4Compress(InputStream in, OutputStream out){
    int noBytesRead = 0;        //number of bytes read from input
    int noBytesProcessed = 0;   //number of bytes processed
    try {
        while ((noBytesRead = in.read(inputBuffer)) >= 0) {
            noBytesProcessed = inputBuffer.length;
            decompressedLength = inputBuffer.length;
            outputBuffer = compress(inputBuffer, decompressedLength);
            out.write(outputBuffer, 0, noBytesRead);
        }
        out.flush();
        in.close();
        out.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void LZ4decompress(InputStream in, OutputStream out){
    int noBytesRead = 0;        //number of bytes read from input
    try {
        while((noBytesRead = in.read(inputBuffer)) >= 0){
            noBytesProcessed = inputBuffer.length;
            outputBuffer = decompress(inputBuffer);
            out.write(outputBuffer, 0, noBytesRead);

        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public static byte[] compress(byte[] src, int srcLen) {
    decompressedLength = srcLen;
    int maxCompressedLength = compressor.maxCompressedLength(decompressedLength);
    byte[] compressed = new byte[maxCompressedLength];
    int compressLen = compressor.compress(src, 0, decompressedLength, compressed, 0, maxCompressedLength);
    byte[] finalCompressedArray = Arrays.copyOf(compressed, compressLen);
    return finalCompressedArray;
}

private static LZ4SafeDecompressor decompressor = factory.safeDecompressor();

public static byte[] decompress(byte[] finalCompressedArray) {
    byte[] restored = new byte[finalCompressedArray.length];
    restored = decompressor.decompress(finalCompressedArray, finalCompressedArray.length);
    return restored;
}

最佳答案

所以我通过使用 LZ4block 输入/输出流解决了我的问题

public static void LZ4compress(String filename, String lz4file){
    byte[] buf = new byte[2048];
    try {
        String outFilename = lz4file;
        LZ4BlockOutputStream out = new LZ4BlockOutputStream(new FileOutputStream(outFilename), 32*1024*1024);
        FileInputStream in = new FileInputStream(filename);
        int len;
        while((len = in.read(buf)) > 0){
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    } catch (IOException e) {

    }
}

public static void LZ4Uncompress(String lz4file, String filename){
    byte[] buf = new byte[2048];
    try {
        String outFilename = filename;
        LZ4BlockInputStream in = new LZ4BlockInputStream(new FileInputStream(lz4file));
        FileOutputStream out = new FileOutputStream(outFilename);
        int len;
        while((len = in.read(buf)) > 0){
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    } catch (IOException e) {

    }
}

关于使用输入/输出流的 Java LZ4 压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36012183/

相关文章:

python-3.x - 使用python解压LZ4

file - 用于 Java 的 LZ4 和 Zstd

julia - 在 Julia 中使用 Arrow.jl 进行数据压缩

java - Spring Boot 授权服务器向外部服务发送请求以获取用户详细信息

java - 我可以将实体 bean 中的字段组合指定为唯一吗?

Java getAudioInputStream() 未找到符号

Java 程序在没有警告的情况下停止工作

java - 从 log4j 1.2 迁移到 log4j 2 - 如何获取所有附加程序的列表和滚动文件策略

centos - 使用dotnet core在Centos上执行linux命令