java - 如何使用 Channel BufferOutputStream 检查压缩大小

标签 java netty apache-commons java-io apache-commons-io

在一个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 字节。将包装未压缩 json 文件的 InputStream 发送到上面的代码,outputStream.writingBytes() 返回 10,这表明它已压缩到仅 10 个字节。这似乎是错误的,所以我想知道问题出在哪里。 ChannelBufferOutputStream javadoc 说: 返回到目前为止该流写入的字节数。所以它应该可以工作。

最佳答案

  1. 在计算字节数之前尝试调用 GZIPOutputStream.finish()flush() 方法
  2. 如果这不起作用,您可以创建一个代理流,其任务是计算通过它的字节数

关于java - 如何使用 Channel BufferOutputStream 检查压缩大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13880218/

相关文章:

java - Spring Security 中 Role 和 GrantedAuthority 的区别

Java - 为什么强制垃圾收集不释放内存

java - 如何创建类似于 C++ 模板类的 Java 类?

java - Netty Camel 示例

java - 在java中使用曲线拟合计算出一个点

java - BidiMap 同步

Java Clock 类没有给我当前时间

httpclient - webClient 问题 - ReactorClientHttpConnector 和 httpClient 之间

java - netty分配的direct buffer的内存在哪里,内核空间还是用户空间?

java - 从java代码调用rabbitmqpublisher