如何在不写入输出流的情况下从 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 中的文件读取/写入数据