Как использовать ChannelBufferOutputStream для проверки размера сжатия

В Java-программе я сжимаю InputStream следующим образом:

ChannelBufferOutputStream outputStream = new ChannelBufferOutputStream(ChannelBuffers.dynamicBuffer(BUFFER_SIZE));
GZIPOutputStream compressedOutputStream = new GZIPOutputStream(outputStream);
try {
   IOUtils.copy(inputStream, compressedOutputStream);
} finally {
   // this should print the byte size after compression
   System.out.println(outputStream.writtenBytes());         
}

Я тестирую этот код с файлом json, который распакован на диск ~31.000 байт и сжат на диск ~7.000 байт. Отправляя InputStream, который оборачивает несжатый файл json в приведенный выше код, outputStream.writtenBytes() возвращает 10, что указывает на то, что он сжат до 10 байтов. Это кажется неправильным, поэтому мне интересно, где проблема. ChannelBufferOutputStream javadoc говорит: Возвращает количество записанных байтов этим потоком до сих пор. Так что должно работать.

1 ответ

Решение
  1. Попробуйте позвонить GZIPOutputStream.finish() или же flush() методы перед подсчетом байтов
  2. Если это не сработает, вы можете создать прокси-поток, задача которого - подсчитать количество байтов, прошедших через него
Другие вопросы по тегам