为什么ZipInputStream无法读取ZipOutputStream的输出?

tan*_*ens 6 java zip

我坚持这个junit测试:

public void test() throws Exception {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ZipOutputStream zipOut = new ZipOutputStream( out );
    zipOut.putNextEntry( new ZipEntry( "file" ) );
    zipOut.write( (new byte[] { 0x01, 0x02, 0x03 }) );
    zipOut.closeEntry();
    zipOut.close();

    ZipInputStream zipIn = new ZipInputStream( new ByteArrayInputStream( out.toByteArray() ) );
    ZipEntry entry = zipIn.getNextEntry();
    assertNotNull( entry );
    assertEquals( "file", entry.getName() );
    assertEquals( 3, entry.getSize() );
}
Run Code Online (Sandbox Code Playgroud)

我正在写一个名为"file"的文件和一个ZipOutputStream的三个字节的内容.然后我尝试用ZipInputStream读取创建的数据,但最后一个断言失败,因为entry.getSize()-1和否3,正如预期的那样.

我在这做错了什么?我需要更改什么才能恢复"文件"的内容?我想,我首先要知道能够从流中读取数据的长度吗?

Pet*_*ego 5

您实际上必须读取条目的内容,然后entry.getSize()才会返回正确的大小。

要阅读条目,请使用:

    byte[] buf = new byte[1024];
    int len;
    while ((len = zipIn.read(buf)) > 0) {
        // use data;
    }
Run Code Online (Sandbox Code Playgroud)

  • 问题是,zipEntry 之前有一个 LOC 条目,zipEntry 之后有一个 EXT 条目。两者都有一个尺寸字段。ZipOutputStream 始终在 LOC.size 中写入 0,而其他归档程序则在 LOC 和 EXT 中写入大小。我想知道这可能会导致多少问题,以及如何使 ZipOutputStream 在 LOC 中写入大小? (2认同)