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

标签 java jakarta-ee file-io inputstream zip

我正在尝试从压缩文件输入流中获取特定文件的字节。我有压缩文件的输入流数据。由此我得到 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;
}

最佳答案

使用 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();

关于java - 如何在不写入输出流的情况下从 ZipInputStream 获取每个 ZipFile 条目的字节/内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20793781/

相关文章:

java - 如何搜索类似本网站效果的推文:Monitter

java - SpringBoot - Controller 和RequestMapping总是返回404

bash 在文件的每一行中搜索字符串

c# - 删除文件前几个字节的最快方法

java - 我应该在域包中放入哪些类?

java - 如何在页面加载后预填充 jsf 输入组件?

java - 如何使用java将excel上传到数据库?

git - 用于运行 glassfish 服务器并从 git 存储库部署特定应用程序的 dockerfile 的内容

java - 如何从应用程序的任何部分访问 HashMap 或 ArrayList?

c - 在文件中搜索字符组合