LZ4 сжатие (C ++) и декомпрессия (Java) - PullRequest
1 голос
/ 11 июля 2020

Моя цель - сжать файл с помощью LZ4 на C ++ и распаковать его в Java.

Мой текстовый файл (A.txt):

Hi, Hello everyone.
Thanks.

Файл после сжатие c ++ (A.txt.lz4):

"M@Pw  €Hi, Hello everyone.
Thanks.

Затем я распаковал его в Java (B.txt):

i, Hello everyone.
Thanks.                                             

Проблема в том, что я не получаю первый символ каждого файла. Я не могу понять, где я ошибаюсь.

Мой java код:

public static void uncompressLz4File(String str1, String str2) {
File f1 = new File(str1);
File f2 = new File(str2);
try (InputStream fin = Files.newInputStream(f1.toPath());
        BufferedInputStream in = new BufferedInputStream(fin);
        OutputStream out = Files.newOutputStream(Paths.get(f2.getAbsolutePath()));
        FramedLZ4CompressorInputStream zIn = new FramedLZ4CompressorInputStream(in))
{
    int n;
    zIn.getCompressedCount();
    byte[] b = new byte[1];
    int uncompressedLength = zIn.read(b, 0, 1) == -1 ? -1 : b[0] & 255;
    b[0] = (byte) uncompressedLength;
    final byte[] buffer = new byte[uncompressedLength];
    while (-1 != (n = zIn.read(buffer)))
    {
        out.write(buffer);
    }
}
catch (Exception e)
{
    
}
}

public static void main(String args[]) throws IOException
{
    String str1 = "C:\\Users\\aravinth\\Desktop\\A.txt.lz4";
    String str2 = "C:\\Users\\aravinth\\Desktop\\B.txt";
    uncompressLz4File(str1, str2);  
}

Любая помощь будет полезна. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Существует factory для создания потоков, которые должны позаботиться о проверке:

CompressorInputStream zIn =
    new CompressorStreamFactory()
    .createCompressorInputStream(CompressorStreamFactory.LZ4_BLOCK, in);

или LZ4_FRAMED в зависимости от того, что генерирует библиотека C ++.

0 голосов
/ 07 августа 2020

Спасибо всем за помощь. Я исправил это с помощью этого кода.

public static void uncompressLz4File(String str1, String str2) {
    File f1 = new File(str1);
    File f2 = new File(str2);
    try (FileInputStream fin = new FileInputStream(f1);
            BufferedInputStream in = new BufferedInputStream(fin);
            OutputStream out = Files.newOutputStream(Paths.get(f2.getAbsolutePath()));
            FramedLZ4CompressorInputStream zIn = new FramedLZ4CompressorInputStream(in)) {
        int n;
        byte[] b = new byte[1024];
        while ((n = zIn.read(b)) > 0) {
            out.write(b, 0, n);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
...