LZ4 и Zstd для Java

Есть ли лучшая библиотека сжатия Java для LZ4 и ZStd. Я пробовал использовать 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,4 ГБ (csv) требуется почти 2 часа (еще не завершено). Что-то не так с кодом? или любые другие предложения?

2 ответа

За zstd, Java имеет zstd-jni @ luben: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, хотя, если вы предпочитаете реализацию, совместимую сlz4CLI, предпочтительнее версия Apache Commons.

Эти библиотеки обычно нельзя поменять местами, просто изменив одно имя вызова. Обратитесь к их документации или примерам, чтобы понять, как они работают.

      import com.github.luben.zstd.Zstd;

public class ZSTD {

    public static void main(String[] args) {

        // Zstd zstd = new Zstd();

        System.out.println("Default compress level:" + Zstd.defaultCompressionLevel());

        try {
            //1.File operation
            byte[] src = File2ByteArray.toByteArray("D:\\works\\ZSTD\\data\\data.bin1");
            src = File2ByteArray.toByteArray("D:\\works\\ZSTD\\data\\aa.txt.zst");
            
            byte[] des = new byte[src.length/4];
            
            System.out.println("src length" + src.length);
            
            Zstd.decompress(des, src);
            
            System.out.println( "result:" +new String(des) );
            
            //2

            String data = "ABC";
            byte[] strSrc = Zstd.compress(data.getBytes());

            //byte[] strDest = new byte[ strSrc.length ];
            byte[] strDest = new byte[strSrc.length/4];
            Zstd.decompress( strDest, strSrc );
            
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}
Другие вопросы по тегам