当前位置: 首页 > 知识库问答 >
问题:

使用apache commons压缩库压缩InputStream

高鸿振
2023-03-14

我有一个学校作业,要求我接受一个输入流,并使用apache commons压缩库将其压缩成一个字节数组,格式有5种(根据用户规范)。这5种格式是:ZIP、JAR、SEVENZ、BZIP2和gzip。我编写了以下方法以JAR格式压缩输入流,但得到了一个带有字符串“no current entry”的illegalStateException。

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个答案

鲁品
2023-03-14

您需要阅读您正在使用的Apache类的javadocs...及其超类。例如,archiveoutputstream的javadoc(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”)异常的意思。

您还可以阅读文档中的示例。这解释了(例如)7z的归档程序有一个不同的超类。

注意,zip、jar和7z文件不是简单的压缩格式。它们是用于将多个文件打包到单个存档中的存档格式。

简而言之,在尝试使用API之前,您应该阅读它的文档。

 类似资料:
  • 我得到无效的zip,当写入文件以下代码: 我将其写入文件的方式是: 我做错了什么?

  • 问题内容: 我知道这是一项容易的任务,但是更改代码后它停止工作,并且无法恢复!我实际上使用了两个函数来进行压缩和解压缩,尽管实际上它是“ jar”和“ unjar”,但这并没有太大的区别 任何帮助/建议吗? 创建JarFile时发生错误: 问题答案: 我不知道这是否是您的问题,但是通常最好在完成写入后关闭每个zip条目。 请参阅。 在显示的代码中,不会关闭邮政编码中的最后一个条目。您也不会显示关闭

  • tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使

  • Tango拥有一个默认的压缩中间件,可以按照扩展名来进行文件的压缩。同时,你也可以要求某个Action自动或强制使用某种压缩。比如: type CompressExample struct { tango.Compress // 添加这个匿名结构体,要求这个结构体的方法进行自动检测压缩 } func (CompressExample) Get() string { return f

  • 所有基于http协议的服务器组件均支持压缩,请求头Accept-Encoding的值需要包含deflate或者gzip。 即便请求头Accept-Encoding的值包含deflate或者gzip,服务器还会参考静态变量http_server::zip_min_size(默认1024,即1KB)和http_server::zip_max_size(默认307200,即300KB)来决定是否压缩:仅

  • 在内存中单次操作 # bz2_memory.py import bz2 import binascii original_data = b'This is the original text.' print('Original : {} bytes'.format(len(original_data))) print(original_data) print() compressed