DeflatorInputStream 和 DeflatorOutputStream 不重建原始数据

2023-11-22

我想压缩一些数据,所以我遇到了 DeflatorInputStream 和 DeflatorOutputStream 类。但是,下面的示例表明,在使用这些类时我似乎无法重建原始数据。

当我切换到 ZipInputStream 和 ZipOutputStream 时,它确实可以工作,但由于我本身不需要 zip 文件,所以我认为通用压缩会更好。我主要有兴趣了解为什么这个例子不起作用。

//Create some "random" data
int bytesLength = 1024;
byte[] bytes = new byte[bytesLength];
for(int i = 0; i < bytesLength; i++) {
     bytes[i] = (byte) (i % 10);
}

//Compress the data, and write it to somewhere (a byte array for this example)
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
DeflaterOutputStream outputStream = new DeflaterOutputStream(arrayOutputStream);
outputStream.write(bytes);

//Read and decompress the data
byte[] readBuffer = new byte[5000];
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(arrayOutputStream.toByteArray());
DeflaterInputStream inputStream = new DeflaterInputStream(arrayInputStream);
int read = inputStream.read(readBuffer);

//Should hold the original (reconstructed) data
byte[] actuallyRead = Arrays.copyOf(readBuffer, read);

//Results differ - will print false
System.out.println(Arrays.equals(bytes, actuallyRead));

归咎于历史先例。在 Unix 上,该函数用于反转deflate叫做inflate。因此,与许多其他 Java IO 类不同,输入和输出流对没有(显然)匹配的名称。

DeflaterOutputStream 实际上不允许您反转紧缩,而是在字节从接收器传递到源时对字节进行紧缩。压缩器输入流also放气,但它会在数据从源流向接收器时执行其操作。

为了以未压缩(膨胀)格式读取数据,您需要使用InflaterInputStream:

InflaterInputStream inputStream = new InflaterInputStream(arrayInputStream);

另外,因为有可能无法一次性从流中获取所有压缩数据read调用时,需要使用循环。像这样的东西:

int read;
byte[] finalBuf = new byte[0], swapBuf;
byte[] readBuffer = new byte[5012];

ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(
        compressed);
InflaterInputStream inputStream = new InflaterInputStream(
        arrayInputStream);
while ((read = inputStream.read(readBuffer)) != -1) {
    System.out.println("Intermediate read: " + read);
    swapBuf = finalBuf;
    finalBuf = new byte[swapBuf.length + read];
    System.arraycopy(swapBuf, 0, finalBuf, 0, swapBuf.length);
    System.arraycopy(readBuffer, 0, finalBuf, swapBuf.length, read);
}

最后,确保在检索压缩字节之前刷新压缩器输出流(或者关闭流)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DeflatorInputStream 和 DeflatorOutputStream 不重建原始数据 的相关文章

随机推荐

  • 当块的宽度改变时是否会调用一个事件?

    我想在我监听的块的宽度发生变化时调用我的代码 如何 onresize仅当窗口大小改变时调用 一个选项可以是使用调整大小观察者 观察所有宽度变化 JS var foo document getElementById foo var obser
  • 匹配单个单词,末尾可能有标点符号或复数形式(正则表达式)

    我在正则表达式方面做得越来越好 但我想出了一些超出我目前能力的事情 我想构建一个函数来测试 返回 true 或 false 来测试是否在字符串中找到单词 但如果这个单词是在另一个单词中找到的 我不想有一个积极的匹配 我还想建立检查复数的可能
  • 如何沿着现有道路在两点之间绘制一条路线?

    我想在我的 Android 应用程序中显示两个位置之间的驾驶路线 我只想在路段顶部绘制路线 关于堆栈溢出本身有几个答案 并且所有答案都使用相同的方法 使用 Google Directions API 获取从起点到目的地的路线 并在返回的点之
  • 在 PHP 中可以使用 array[key] 吗?

    是否可以使用不带单引号或双引号的数组 例如 array key 我认为这很糟糕 因为如果我不使用单引号或双引号 PHP 首先查找常量 我的一位同事告诉我 这并不重要 你们有什么感想 不被认为是OK 即使它在大多数情况下都有效 基本上 当 P
  • 如果我不在的情况下我的计算机进入睡眠模式/休眠模式,我正在执行的硒脚本会停止吗?我

    如果我不在的情况下我的计算机进入睡眠模式 休眠模式 我正在执行的 selenium 脚本是否会停止 如果是 那么摆脱这个问题的理想方法是什么 首先 睡眠或休眠将断开您的互联网服务 其次 Hibernate 还会中断或停止许多进程 在睡眠模式
  • Cypress:具有三个不同响应的同一路由的存根响应

    我的应用程序中有一个端点 我们为每个请求使用相同的 api 并在参数中使用不同的操作 URL application api 示例请求负载 1 action CARD TRANSACTION HISTORY data date from 2
  • python中什么时候需要使用global关键字

    好吧 所以我遇到了这个非常烦人的问题 其中一个变量在本地设置 但随后在该函数之外恢复到它的旧值 在本例中为 无 但同时我可以操纵其他变量 并且仍然可以不使用 全局 关键字 我无法提供真正的代码 但它是这样的 foo foo foo bar
  • 如何在SQL Server中预编译存储过程?

    有没有办法在 SQL Server 中预编译存储过程 我的要求是这样的 我有一些存储过程 编译时间比执行时间多 所以我想预编译所有存储过程 当数据库服务器启动并运行时预编译它们会很好 任何关于这方面的想法都会非常有帮助 使用 SET FMT
  • WebView 不调整大小

    我已经为 Firefox OS 开发了一个 Web 应用程序 但我想让它在 Android 中 本地 运行 我的应用程序由一个对话框组成div它在可见时填充整个页面 我使用 Firefox 响应式设计工具对其进行了测试 并且它确实可以正确调
  • SQLite 支持引用完整性吗?

    我有一个 Django Web 服务器配置为使用 SQLite 在多对多关系 带有额外字段 中 Django 强制我使用关系模型来建立两个对象之间的关系 但我能够在相关表中尚不存在的对象之间创建关系 例如 I have table1 and
  • Django 模板如何使用变量查找字典值

    mydict key1 value1 key2 value2 在 Django 模板中查找字典值的常规方法是 mydict key1 mydict key2 如果键是循环变量怎么办 IE for item in list where ite
  • jquery:选择文本事件

    当用户选择一些文本 非文本区域或输入 时 jquery 是否可以调用我的回调来让我知道选择了哪个 div 的文本 并且如果选择焦点丢失也调用我的回调 Thanks 有点令人惊讶的是 没有简单的方法可以做到这一点 IE 有一个select在所
  • 提交表单中的 Laravel 日期格式 (d-M-Y)

    在刀片模板的提交表单中 我有以下日期表单 它与默认日期一起正常工作 例如Y m d 但我想显示日期d M Y 我试图找到一个可用的解决方案 但运气不佳 以下是适用于默认日期的代码 这是模型 public static rules birth
  • R根据条件创建因子

    我需要根据数值高于或低于 10 将列从数字更改为因子 例如 有以下数据 age lt c 1 20 hight lt c 1 20 d frame lt data frame age hight 我尝试了以下方法 d frame hight
  • Android GridView 带分隔符

    GridView 的元素之间可以有分隔符吗 Thanks 您可能需要使用填充和背景颜色 将表的背景设置为一种颜色 并将表中每个视图的背景设置为另一种颜色 在表中的每个视图周围设置 1 或 2 像素的填充 并且之间应该有边框
  • 如何在 Apple 的时钟应用程序中实现 Apple 的“贪睡”功能?

    我正在深入研究 iOS 开发 并正在构建自己的闹钟应用程序以熟悉该平台和 SDK 我目前正在学习的 API 之一是本地通知 API 我认为它与 Apple 用于在时钟应用程序中实现闹钟的 API 相同 我不明白的是他们如何实现 贪睡 功能
  • Heroku 与 Postgres 上的 ConnectionTimeoutError

    我在 Heroku 上部署的应用程序遇到问题 它在本地环境上运行良好 但部署到 Heroku 时经常会出现应用程序错误 日志中的异常是 ActiveRecord ConnectionTimeoutError 无法在 5 000 秒内获取数据
  • WCF、ASP.NET 成员资格提供程序和身份验证服务

    我编写了一个与 WCF 服务 BasicHttpBinding 通信的 Silverlight 2 应用程序 托管 Silverlight 内容的站点使用 ASP NET 成员资格提供程序进行保护 我可以使用 WCF 服务中的 HttpCo
  • 删除App时的委托方法

    当应用程序即将被删除时 iOS 中是否有委托方法 我正在尝试向服务器发送设备将不再接收通知的信息 不会 删除应用程序时不会触发委托方法
  • DeflatorInputStream 和 DeflatorOutputStream 不重建原始数据

    我想压缩一些数据 所以我遇到了 DeflatorInputStream 和 DeflatorOutputStream 类 但是 下面的示例表明 在使用这些类时我似乎无法重建原始数据 当我切换到 ZipInputStream 和 ZipOut