如何在不写入输出流的情况下从 ZipInputStream 获取每个 ZipFile 条目的字节/内容?

Posted

技术标签:

【中文标题】如何在不写入输出流的情况下从 ZipInputStream 获取每个 ZipFile 条目的字节/内容?【英文标题】:How to get bytes/contents of each ZipFile entry from ZipInputStream without writing to outputstream? 【发布时间】:2014-01-14 15:18:11 【问题描述】:

我正在尝试从压缩文件输入流中获取特定文件的字节。我有压缩文件的输入流数据。从这里我得到 ZipEntry 并将每个 ZipEntry 的内容写入输出流并返回字节缓冲区。这将返回缓冲区大小的输出流,而不是每个特定文件的内容。有没有办法可以将 FileOutputStream 转换为字节或直接读取每个 ZipEntry 的字节?

我需要将 ZipEntry 内容作为输出返回。我不想写入文件,只想获取每个 zip 条目的内容。

感谢您的帮助。

public final class ArchiveUtils 

private static String TEMP_DIR = "/tmp/unzip/";

public static byte[] unZipFromByteStream(byte[] data, String fileName) 

    ZipEntry entry = null;
    ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(data));
    File tempDirectory = ensureTempDirectoryExists(TEMP_DIR);
    try 
        while ((entry = zis.getNextEntry()) != null) 

            if (!entry.isDirectory()) 
                System.out.println("-" + entry.getName());

                File file = new File(tempDirectory + "/"+ entry.getName());

                if (!new File(file.getParent()).exists())
                    new File(file.getParent()).mkdirs();
                OutputStream out = new FileOutputStream(entry.getName());
                byte[] byteBuff = new byte[1024];
                int bytesRead = 0;
                while ((bytesRead = zis.read(byteBuff)) != -1)
                
                    out.write(byteBuff, 0, bytesRead);
                
                out.close();
                if(entry.getName().equals(fileName))
                return byteBuff;
                
            
        
     catch (Exception ex) 
        ex.printStackTrace();
    
    return null;


private static File ensureTempDirectoryExists(String outputPath) 

    File outputDirectory = new File(outputPath);
    if (!outputDirectory.exists()) 
        outputDirectory.mkdir();
    
    return outputDirectory;

【问题讨论】:

不要写信给FileOutputStream,而是写信给ByteArrayOutputStream 【参考方案1】:

像这样使用java.io.ByteArrayOutputStream -

ByteArrayOutputStream out = null; // outside of your loop (for scope).

// where you have a FileOutputStream.
out = new ByteArrayOutputStream(); // doesn't use entry.getName(). 

然后你就可以了

return (out == null) ? null : out.toByteArray();

【讨论】:

【参考方案2】:

从 ZIP 文件中的文件读取的方式是从 ZipInputStream 读取,而从 getNextEntry 获得的最后一个条目是您要读取的条目。

【讨论】:

以上是关于如何在不写入输出流的情况下从 ZipInputStream 获取每个 ZipFile 条目的字节/内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 JCL 中的 XSUM 的情况下从输入文件中删除重复项并将重复项写入文件? [关闭]

如何在不将单独的帧图像写入磁盘的情况下从 C++ 程序中生成的多个图像编码视频?

在不使用 UTL_FILE 的情况下从 PL/SQL 中的文件读取/写入数据

如何在不使用临时文件的情况下从 Java 中的嵌套 zip 文件中读取数据?

如何在不回显的情况下从 shell 脚本中获取密码

如何将所有输出流写入 PowerShell 中的变量?