【问题标题】:NegativeArraySizeException while unzipping a ZipInputStream解压缩 ZipInputStream 时出现 NegativeArraySizeException
【发布时间】:2014-06-03 06:55:56
【问题描述】:

我尝试使用 ZipInputStream/ZipOutputStream 将一些文件从服务器发送到客户端。

在服务器端,一切顺利,但在客户端,当我想解压时,文件的大小是-1

所以它失败了。我应该怎么做?为什么会这样?

             socket = new Socket("127.0.0.1",3000);

         String outDir = "C:\\here";



             BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());            



            ZipInputStream zips = new ZipInputStream(bis);
            ZipEntry zipEntry = null;




              while(null != (zipEntry = zips.getNextEntry())){
             String fileName = zipEntry.getName();
                File outFile = new File(outDir + "/" + fileName);
        System.out.println(outFile.getName()+"      "+zipEntry.getCompressedSize());

    if(zipEntry.isDirectory()){
    File zipEntryFolder = new File(zipEntry.getName());
    if(zipEntryFolder.exists() == false){
     outFile.mkdirs();

    }

        continue;
    }else{
    File parentFolder = outFile.getParentFile();
    if(parentFolder.exists() == false){
     parentFolder.mkdirs();
    }
   }

   System.out.println("ZipEntry::"+zipEntry.getCompressedSize());



        FileWriter fW=new FileWriter(outFile);
            try (BufferedWriter bfW = new BufferedWriter(fW)) {
                bfW.write(zips.getNextEntry().toString());
            }
                                                                    }

              socket.close();

                                                            }

zipEntry.getCompressedSize(); 的结果等于 -1。但是在将它写入服务器中的套接字之后,我检查了大小,它是实际大小。所以我感到困惑。

IDE 给出的异常是错误在客户端无效存储块长度

【问题讨论】:

  • @JqueryLearner 为什么为空?如果你仔细阅读代码,它已经被nextentry填充了

标签: java file exception client-server


【解决方案1】:

您永远不能依赖getSize 返回实际的未压缩大小。您需要从 ZipInputStream 调用 zips.read,直到它不再读取任何字节。

【讨论】:

  • 现在我把整个代码,包括整个过程,它给出了一个错误。我知道如果从 Long 缩小到 int 可能会导致符号变化,但是在我已经提到的那一行,我没有进行任何转换,但仍然给出了 - 1
  • 它总是返回-1。您不能依赖它返回大小。它有时会返回大小,但大多数时候会返回 -1。文档甚至这么说。 (嗯,它并没有说它在大多数时候发生,但它确实说它发生了)
  • zipEntry.getCompressedSize(); 怎么样?因为它也给出了 -1 并且 IDE 将此作为异常 Error in Client invalid stored block lengths
  • 我不知道 getCompressedSize,但我以为你想要未压缩的大小。
  • 但首先在解压缩之前,我尝试查看大小,因为 IDE 给出了异常,即 客户端无效存储块长度错误
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多