Сжатие InputStream с использованием библиотеки сжатия Apache Commons - PullRequest
0 голосов
/ 12 марта 2019

У меня есть школьное задание, которое требует от меня принять входной поток и сжать его в байтовый массив с одним из 5 форматов (по спецификации пользователя) с использованием библиотеки сжатия Apache commons.5 форматов: ZIP, JAR, SEVENZ, BZIP2 и GZIP.Я написал следующий метод для сжатия входного потока с форматом JAR, но я получаю falseStateException со строкой «Нет текущей записи».

private byte[] documentJARCompression(InputStream in) throws IOException {
    BufferedInputStream buffIn = new BufferedInputStream(in);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    JarArchiveOutputStream jarOut = new JarArchiveOutputStream(out);
    final byte[] buffer = new byte[out.size()];
    int n = 0;
    while (-1 != (n = buffIn.read(buffer))) {
        jarOut.write(buffer, 0, n);
    }
    jarOut.close();
    return buffer;
}

1 Ответ

0 голосов
/ 12 марта 2019

Вам нужно прочитать javadoc для используемых вами классов Apache ... и его суперклассов.Например, javadoc для ArchiveOutputStream (супертип для классов архиватора jar и zip) говорит следующее:

Обычная последовательность вызовов при работе с ArchiveOutputStreams:

Create ArchiveOutputStream object,
optionally write SFX header (Zip only),
repeat as needed:
    putArchiveEntry(ArchiveEntry) (writes entry header),
    OutputStream.write(byte[]) (writes entry data, as often as needed),
    closeArchiveEntry() (closes entry), 
finish() (ends the addition of entries),
optionally write additional data, provided format supports it,
OutputStream.close().

Вы запустили вызов write прямо, не предоставив архиватору необходимую ему информацию о записи, которую вы добавляете в файл JAR.Это то, что говорит исключение IllegalStateException("No current entry").

Вы также можете прочитать examples в документации.Это объясняет (например), что архиватор для 7z имеет другой суперкласс.

Обратите внимание, что файлы zip, jar и 7z не являются просто форматами сжатия.Это архивные форматы для упаковки нескольких файлов в один архив.


Короче говоря, вы должны прочитать документацию API, прежде чем пытаться ее использовать.

...