提取 zip 并转换为每个文件的 base 64

Extract the zip and convert to base 64 of each file

我正在从系统中读取附件列表 returns base 64 编码字符串中的附加文档作为 zip,我的 objective 是获取 base 64 编码每个附加文档的字符串。 注意:- 我正在尝试下面的代码,我正在解压缩 zip 并在我的本地文件系统中写入。 .但实际上我想为每个文件获取 base 64 格式而不在本地文件系统中写入文件。

public class UnzipUtility {
      private static final int BUFFER_SIZE = 4096;

         private static void extractFile(ZipInputStream zipIn, ZipEntry entry) throws IOException {


            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/Project/"+File.separator+entry.getName()));
            byte[] bytesIn = new byte[BUFFER_SIZE];
            System.out.println("File Name  "+entry.getName());
            int read = 0;
            while ((read = zipIn.read(bytesIn)) != -1) {
                //Hear I dont not want to write the output stream insted I want to get the base64 data for each file.
              bos.write(bytesIn);
            }
            bos.close();
        }
     public static void main(String[] args) throws IOException {
     String attachmentVariable="zip base 64 data"
          byte[] bytedata = attachmentVariable.getBytes("UTF-8");
         byte[] valueDecoded = Base64.decodeBase64(bytedata);
         ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(valueDecoded));
         ZipEntry entry = zipIn.getNextEntry();

            // iterates over entries in the zip file
             while (entry != null) {                    extractFile(zipIn,entry);
                    zipIn.closeEntry();
                    entry = zipIn.getNextEntry();


          }       

        }
}

要在写入 OutputStream 时对数据进行 Base64 编码,请使用 Encoder.wrap(OutputStream os) 方法。

默认情况下,BufferedOutputStream 将使用 8192 字节的缓冲区,因此如果将 BUFFER_SIZE 增加到 8192,则不需要 BufferedOutputStream

您应该使用 try-with-resources 和较新的 NIO.2 API.

这意味着您的代码应该是:

private static final int BUFFER_SIZE = 8192;

private static void extractFile(ZipInputStream zipIn, ZipEntry entry) throws IOException {
    try ( OutputStream fos = Files.newOutputStream(Paths.get("D:/Project", entry.getName()));
          OutputStream b64os = Base64.getEncoder().wrap(fos); ) {
        System.out.println("File Name  " + entry.getName());
        byte[] buf = new byte[BUFFER_SIZE];
        for (int len = 0; (len = zipIn.read(buf)) != -1; ) {
            b64os.write(buf, 0, len);
        }
    }
}

所以,你有一个 Base64 编码的字符串和一个 zip 文件,你想要一个 Map<String, String>,其中键是 zip 条目名称,值是 Base64 编码的内容。

在 Java 9+ 中,可以像这样轻松完成:

String base64ZipFile = "zip base 64 data";
Map<String, String> base64Entries = new LinkedHashMap<>();
try (ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(base64ZipFile)))) {
    Encoder encoder = Base64.getEncoder();
    for (ZipEntry entry; (entry = zipIn.getNextEntry()) != null; ) {
        base64Entries.put(entry.getName(), encoder.encodeToString(zipIn.readAllBytes()));
    }
}