【问题标题】:How can I read files from Zip file to memory with Java?如何使用 Java 将 Zip 文件中的文件读取到内存中?
【发布时间】:2011-11-10 01:50:48
【问题描述】:

我从 SUN 网站 (http://java.sun.com/developer/technicalArticles/Programming/compression/) 找到了示例,但它返回 BufferedOutputStream。但我想将 ZipEntry 文件作为 InputStream 获取,然后处理下一个文件。那可能吗?我的程序无法访问硬盘,所以它甚至无法临时保存文件。

import java.io.*;
import java.util.zip.*;

public class UnZip {
   final int BUFFER = 2048;
   public static void main (String argv[]) {
      try {
         BufferedOutputStream dest = null;
         FileInputStream fis = new 
       FileInputStream(argv[0]);
         ZipInputStream zis = new 
       ZipInputStream(new BufferedInputStream(fis));
         ZipEntry entry;
         while((entry = zis.getNextEntry()) != null) {
            System.out.println("Extracting: " +entry);
            int count;
            byte data[] = new byte[BUFFER];
            // write the files to the disk
            FileOutputStream fos = new 
          FileOutputStream(entry.getName());
            dest = new 
              BufferedOutputStream(fos, BUFFER);
            while ((count = zis.read(data, 0, BUFFER)) 
              != -1) {
               dest.write(data, 0, count);
            }
            dest.flush();
            dest.close();
         }
         zis.close();
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

【问题讨论】:

    标签: java zip unzip


    【解决方案1】:

    好吧,只需将写入文件的部分更改为您想要对数据执行的操作即可。

    while((entry = zis.getNextEntry()) != null) {
        System.out.println("Extracting: " + entry);
        int count;
        byte[] data = new byte[BUFFER];
        String filename = entry.getName();
        System.out.println("Filename: " + filename);
        while ((count = zis.read(data, 0, BUFFER)) != -1) {
           // Do whatever you want with the data variable
           System.out.println(data);
        }
    }
    

    【讨论】:

    • byte[] data = new byte[BUFFER];??
    • @JohnSmith puth a 1024 int 这是你每次迭代时要从你的 zip 条目中读取的字节数
    • 如果想将data 转换为字符串,不要忘记删除数组中的尾随空字节!像这样转换它new String(data).replaceAll("\u0000.*", "")。这个解决方案取自this question
    • @Jay 不,您首先从data 中取出count 字节以防止出现这些空字符!无论如何感谢您的编辑。
    • 对,有道理,感谢您的澄清!所以应该是new String(data, 0, count) 更好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多