当前位置: 首页 > 面试题库 >

DeflatorInputStream和DeflatorOutputStream不重建原始数据

李捷
2023-03-14
问题内容

我想压缩一些数据,所以遇到了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上,用于反转a的函数deflate称为inflate。因此,与许多其他Java
IO类不同,输入和输出流对不具有(显然)匹配的名称。

实际上,DeflaterOutputStream不允许您逆转通缩,而是在将字节从接收器传递到源时,对字节进行放气。DeflaterInputStream
也可以 放气,但是它在数据从源流向接收器时执行其操作。

为了读取未压缩(膨胀)格式的数据,您需要使用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);
}

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



 类似资料:
  • 问题内容: 假设我有一些无法访问原始PHP创建的数组的源输出: 现在,我想输入该数据,并使算法重新创建它正在打印的原始数组,以便可以将其用于自己的应用程序。 目前,我正在考虑a 和regex语句来提取数据并将其适当放置。在我进一步介绍之前,有没有一种更简单的方法,通过已经编写的代码或php插件为我准备好了呢? 问题答案: 不是我的代码,请在注释中找到:print_r’Matt ‘是所有者

  • 问题内容: 我试图使用sqlalchemy执行原始sql查询,想知道什么是“正确”的方法。 我的查询如下(目前): 我不喜欢的是字符串格式和缺少任何参数处理(在music_volume中用引号引起来的:-D)。 我试图遵循以下答案: 如何在SQLAlchemy- flask应用程序中执行原始SQL 应用我阅读的内容后,我的代码段如下所示: 但是我收到错误,指出mv和ml无法识别参数。 如果我将代码

  • 我正在尝试使用sqlalchemy执行原始sql查询,并想知道什么是“正确”的方法。 我的查询如下(目前): 我不喜欢的是字符串格式和缺乏任何参数处理(你好music_volume引号:-D)。 我试图遵循这个答案: 如何在SQLAlchemy flask应用程序中执行原始SQL 应用我读到的内容后,我的代码片段如下所示: 然而,我得到的错误,mv和ml是不能识别的参数。 如果我把我的代码片段改成

  • 我正在使用Spring Security和前端reactJS的Spring Boot构建一个应用程序。我的代码可以很好地进行身份验证。但现在我计划将用户重定向到他以前请求的页面,以防他再次登录。 我可以从成功处理程序中提取 targetUrl,即上一页,但是当我在 UI 上执行控制台.log(数据)时。我得到的是原始的html数据而不是URL名称。我不知道为什么以及如何打开这样的原始 html 代

  • 一、如何导出 诸葛io可以提供未来一个月的原始数据导出(如您要导出7.1~7.30的数据,需要您在6.30之前联系我们),导出的数据为json格式,您可以联系工作人员并整理以下信息进行数据导出,导出后我们会将数据压缩并发送到指定邮箱。 应用id: 公司名称: 邮箱地址: 二、数据导出格式说明 1. 移动端数据格式 { "owner": "zg", "st": 1493895485371,

  • Navicat 通常标识用户在表输入的字符串为一般字符串,任何特殊字符或函数将被处理为纯文本(即是它的功能会被忽略)。 在“原始数据模式”编辑数据是一个方便和直接的方法来应用服务器的内置函数。若要使用原始数据模式功能,只需简单地选择“查看”->“显示”->“原始数据模式”。 【注意】仅适用于 MySQL、Oracle、PostgreSQL、SQL Server 和 MariaDB。