【问题标题】:In Java: How to zip file from byte[] array?在 Java 中:如何从 byte[] 数组中压缩文件?
【发布时间】:2008-12-10 22:34:42
【问题描述】:

我的应用程序正在通过 SMTP 服务器接收电子邮件。电子邮件中有一个或多个附件,电子邮件附件返回为 byte[](使用 sun javamail api)。

我正在尝试即时压缩附件文件而不先将它们写入磁盘。

实现此结果的可能方法是什么?

【问题讨论】:

    标签: java zip


    【解决方案1】:

    您可以使用 Java 的 java.util.zip.ZipOutputStream 在内存中创建一个 zip 文件。例如:

    public static byte[] zipBytes(String filename, byte[] input) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(baos);
        ZipEntry entry = new ZipEntry(filename);
        entry.setSize(input.length);
        zos.putNextEntry(entry);
        zos.write(input);
        zos.closeEntry();
        zos.close();
        return baos.toByteArray();
    }
    

    【讨论】:

    • 您先生,救了我的命!
    • @Deve 我有同样的情况,但我必须压缩 5 个文件。有什么建议吗?
    • @Deva 你可以为你喜欢的多个文件重复 ZipEntry 部分。
    • @AshishBurnwal ZipOutputStream 执行实际的压缩和编码。它从数组中获取字节并生成一个压缩的字节流,这些字节流被馈送到 ByteArrayOutputStream。然后,我们从底层流中访问并返回那些压缩的、编码的字节以返回它们。
    • 非常感谢!!你也拯救了我的一天和我的冲刺!
    【解决方案2】:

    我有同样的问题,但我需要一个 zip 中的许多文件。

     protected byte[] listBytesToZip(Map<String, byte[]> mapReporte) throws IOException {
        String extension = ".pdf";
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(baos);
        for (Entry<String, byte[]> reporte : mapReporte.entrySet()) {
            ZipEntry entry = new ZipEntry(reporte.getKey() + extension);
            entry.setSize(reporte.getValue().length);
            zos.putNextEntry(entry);
            zos.write(reporte.getValue());
        }
        zos.closeEntry();
        zos.close();
        return baos.toByteArray();
    }
    

    【讨论】:

      【解决方案3】:

      您可以从字节数组创建一个 zip 文件并返回到 ui streamedContent

      public StreamedContent getXMLFile() {
              try {
                  byte[] blobFromDB= null;
                  ByteArrayOutputStream baos = new ByteArrayOutputStream();
                  ZipOutputStream zos = new ZipOutputStream(baos);
                  String fileName= "fileName";
                  ZipEntry entry = new ZipEntry(fileName+".xml");
                  entry.setSize(byteArray.length);
                  zos.putNextEntry(entry);
                  zos.write(byteArray);
                  zos.closeEntry();
                  zos.close();
                  InputStream is = new ByteArrayInputStream(baos.toByteArray());
                  StreamedContent zipedFile= new DefaultStreamedContent(is,   "application/zip", fileName+".zip", Charsets.UTF_8.name());
                  return fileDownload;
              } catch (IOException e) {
                  LOG.error("IOException e:{} ",e.getMessage());
              } catch (Exception ex) {
                  LOG.error("Exception ex:{} ",ex.getMessage());
              }
      }
      

      【讨论】:

        【解决方案4】:

        也许java.util.zip 包可能会对您有所帮助

        由于您询问如何从字节数组转换,我认为(未测试)您可以使用 ByteArrayInputStream 方法

        int     read(byte[] b, int off, int len)
                  Reads up to len bytes of data into an array of bytes from this input stream.
        

        你将喂给

        ZipInputStream  This class implements an input stream filter for reading files in the ZIP file format.
        

        【讨论】:

          【解决方案5】:

          【讨论】:

            【解决方案6】:
            ByteArrayInputStream bais = new ByteArrayInputStream(retByte);
                            
            ZipInputStream zis = new ZipInputStream(bais);
                       
            zis.getNextEntry();
            
            Scanner sc = new Scanner(zis);
            while (sc.hasNextLine()) {
                System.out.println("-->:" +sc.nextLine());
            }
            
            zis.closeEntry();
            zis.close();
            

            【讨论】:

              【解决方案7】:
                 byte[] createReport() {
                  try {
                   ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                   ZipArchiveOutputStream zipOutputStream = new 
                   ZipArchiveOutputStream(byteArrayOutputStream);
                   
                   zipOutputStream.setMethod(ZipArchiveOutputStream.STORED);
                   zipOutputStream.setEncoding(ENCODING);
              
                   String text= "text";
                   byte[] textBytes = text.getBytes(StandardCharsets.UTF_8);
              
                   ArchiveEntry zipEntryReportObject = newStoredEntry("file.txt", textBytes);
                   zipOutputStream.putArchiveEntry(zipEntryReportObject);
                   zipOutputStream.write(textBytes);
              
                   zipOutputStream.closeArchiveEntry();
                   zipOutputStream.close();
                  
                   return byteArrayOutputStream.toByteArray();
                   } catch (IOException e) {
                     return null;
                  }
              

              ArchiveEntry newStoredEntry(String name, byte[] data) {
                  ZipArchiveEntry zipEntry = new ZipArchiveEntry(name);
                  zipEntry.setSize(data.length);
                  zipEntry.setCompressedSize(zipEntry.getSize());
                  CRC32 crc32 = new CRC32();
                  crc32.update(data);
                  zipEntry.setCrc(crc32.getValue());
                  return zipEntry;
                }
              

              【讨论】:

              • 请说明您的代码需要一个外部库,例如 Apache Commons Compress
              【解决方案8】:
              public static void createZip(byte[] data) throws ZipException {
                  ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(data));
                  ZipParameters parameters = new ZipParameters();
                  parameters.setFileNameInZip("bank.zip");
                  new ZipFile("F:\\ssd\\bank.zip").addStream(new ByteArrayInputStream(data), parameters);
              }
              

              【讨论】:

              • 使用 net.lingala.zip4jzip4j2.6.4
              猜你喜欢
              • 2011-10-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多