将zip文件编码为Base64,而无需在文件系统上写入zip

时间:2018-08-09 09:56:07

标签: java base64 zip

出于我的目的,我想压缩zip文件夹中的某些文件。然后,该zip文件必须被编码为Base64。不用在文件系统上写zip文件怎么办?

private static String zipB64(List<File> files) throws FileNotFoundException, IOException {

    String encodedBase64 = null;
    String zipFile = C_ARCHIVE_ZIP;
    byte[] buffer = new byte[1024];

    try (FileOutputStream fos = new FileOutputStream(zipFile); ZipOutputStream zos = new ZipOutputStream(fos);) {

        for (File f : files) {

            FileInputStream fis = new FileInputStream(f);
            zos.putNextEntry(new ZipEntry(f.getName()));
            int length;
            while ((length = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, length);
            }
            zos.closeEntry();
        }
    }
    File originalFile = new File(C_ARCHIVE_ZIP);
    byte[] bytes = new byte[(int)originalFile.length()];
    encodedBase64 = Base64.getEncoder().encodeToString(bytes);
    return encodedBase64;
}

2 个答案:

答案 0 :(得分:1)

Stephen C答案的经过测试和编译的版本:

private static String zipB64(List<File> files) throws IOException {
    byte[] buffer = new byte[1024];
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (ZipOutputStream zos = new ZipOutputStream(baos)) {
        for (File f : files) {
            try (FileInputStream fis = new FileInputStream(f)) {
                zos.putNextEntry(new ZipEntry(f.getName()));
                int length;
                while ((length = fis.read(buffer)) > 0) {
                    zos.write(buffer, 0, length);
                }
                zos.closeEntry();
            }
        }
    }
    byte[] bytes = baos.toByteArray();
    return Base64.getEncoder().encodeToString(bytes);
}

您可以复制粘贴。

答案 1 :(得分:0)

这是使用ByteArrayOutputStream使用内存缓冲区替换文件的方式。

此代码未经测试/未经编译。将其视为“草图”,而不是复制和粘贴的成品。

private static String zipB64(List<File> files) throws IOException {
    byte[] buffer = new byte[1024];
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try (ZipOutputStream zos = new ZipOutputStream(baos)) {
        for (File f : files) {
            try (FileInputStream fis = new FileInputStream(f)) {
                zos.putNextEntry(new ZipEntry(f.getName()));
                int length;
                while ((length = fis.read(buffer)) > 0) {
                    zos.write(buffer, 0, length);
                }
                zos.closeEntry();
            }
        }
    }
    byte[] bytes = baos.toByteArray();
    encodedBase64 = new String(Base64.getEncoder().encodeToString(bytes));
    return encodedBase64;
}

(原始版本中存在错误。除了在文件系统中保留一个临时文件之外,您的代码还泄漏了要添加到ZIP中的文件的文件描述符。)