【问题标题】:LZ4 and Zstd for Java用于 Java 的 LZ4 和 Zstd
【发布时间】:2020-07-13 09:50:58
【问题描述】:

是否有适用于 LZ4 和 ZStd 的最佳 Java 压缩库。我尝试过使用 apache commons(这是 zstd-jni 实现)

            String fileURL = TestFileUtil.getFileURL(TestFileCategory.SMALL);
            String outputFileName = TestFileUtil.BASE_DIR+"/zstd-"+(Math.random()*10)+".x";
            System.out.println(Paths.get(fileURL));
            printFileInfo(fileURL);
            StopWatch watch = new StopWatch();          
            InputStream in = Files.newInputStream(Paths.get(fileURL));
            OutputStream fout = Files.newOutputStream(Paths.get(outputFileName));
            BufferedOutputStream out = new BufferedOutputStream(fout);
            ZstdCompressorOutputStream zOut = new ZstdCompressorOutputStream(out);
            int buffersize = 1024*4;
            watch.mark();
            final byte[] buffer = new byte[buffersize];
            int n = 0;
            while (-1 != (n = in.read(buffer))) {
                zOut.write(buffer, 0, n);
            }
            zOut.close();
            in.close(); 

但是这段代码不起作用它会抛出

Exception in thread "main" java.lang.NoClassDefFoundError: com/github/luben/zstd/ZstdOutputStream
    at org.apache.commons.compress.compressors.zstandard.ZstdCompressorOutputStream.<init>(ZstdCompressorOutputStream.java:83)
    at com.zoho.test.testzstd.main(testzstd.java:28)
Caused by: java.lang.ClassNotFoundException: com.github.luben.zstd.ZstdOutputStream
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 2 more

对于 LZ4,我只需将 ZStdCompressorOutputStream 替换为

FramedLZ4CompressorOutputStream lzOut = new FramedLZ4CompressorOutputStream(out);

但压缩 2.4GB (csv) 文件需要将近 2 小时(尚未完成)。 代码有什么问题吗?或任何其他建议?

【问题讨论】:

    标签: file lossless-compression lz4 zstd


    【解决方案1】:

    对于 zstd,Java 有 @luben 的 zstd-jni : https://github.com/luben/zstd-jni

    如果您更喜欢 Java 原生,@martint 有一个完整的 Java 端口(尽管功能较少),位于: https://github.com/airlift/aircompressor/tree/master/src/main/java/io/airlift/compress/zstd

    对于 LZ4,常见的绑定是:https://github.com/lz4/lz4-java, 不过,如果您更喜欢与lz4 CLI 兼容的实现,则最好使用Apache Commons 版本。

    这些库通常不能仅通过更改一个调用名称来交换。请参阅他们的文档或示例以了解它们的工作原理。

    【讨论】:

    • 您有使用 luben 库进行字符串压缩的具体示例吗?我真的很难得到一个。试过这个但它不起作用: byte[] zstdBytes = Zstd.compress(payload.getBytes(StandardCharsets.UTF_8)); ZstdInputStream zstdInputStream= new ZstdInputStream(new ByteArrayInputStream(zstdBytes));
    • 是的,该链接由我回答我自己的问题:) 我能够克服我的问题。感谢您花时间回答我的问题:thumbup
    猜你喜欢
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2015-11-28
    • 2016-06-30
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多