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

Java 将zip文件编码为Base64,而不在文件系统上写入zip,java,base64,zip,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[] b

出于我的目的,我想压缩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;
}
私有静态字符串zipB64(列表文件)抛出FileNotFoundException、IOException{
字符串encodedBase64=null;
字符串zipFile=C_ARCHIVE_ZIP;
字节[]缓冲区=新字节[1024];
try(FileOutputStream fos=newfileoutputstream(zipFile);zipoutpstream zos=newzipoutpstream(fos);){
用于(文件f:文件){
FileInputStream fis=新的FileInputStream(f);
新ZipEntry(f.getName());
整数长度;
而((长度=fis.read(缓冲区))>0){
写入(缓冲区,0,长度);
}
zos.closeEntry();
}
}
File originalFile=新文件(C_ARCHIVE_ZIP);
byte[]bytes=新字节[(int)originalFile.length()];
encodedBase64=Base64.getEncoder().encodeToString(字节);
返回编码dbase64;
}

这是使用
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;
}
私有静态字符串zipB64(列表文件)引发IOException{
字节[]缓冲区=新字节[1024];
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
try(ZipOutputStream zos=新的zipoutpstream(baos)){
用于(文件f:文件){
try(FileInputStream fis=newfileinputstream(f)){
新ZipEntry(f.getName());
整数长度;
而((长度=fis.read(缓冲区))>0){
写入(缓冲区,0,长度);
}
zos.closeEntry();
}
}
}
byte[]bytes=baos.toByteArray();
encodedBase64=新字符串(Base64.getEncoder().encodeToString(字节));
返回编码dbase64;
}

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

测试并编译了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);
}
私有静态字符串zipB64(列表文件)引发IOException{
字节[]缓冲区=新字节[1024];
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
try(ZipOutputStream zos=新的zipoutpstream(baos)){
用于(文件f:文件){
try(FileInputStream fis=newfileinputstream(f)){
新ZipEntry(f.getName());
整数长度;
而((长度=fis.read(缓冲区))>0){
写入(缓冲区,0,长度);
}
zos.closeEntry();
}
}
}
byte[]bytes=baos.toByteArray();
返回Base64.getEncoder().encodeToString(字节);
}

您可以复制粘贴它。

到目前为止您尝试了什么?好的:),谢谢您的修改。老实说,我还没有测试这个函数。我现在就试试。对于那些一直想修改这个答案的人来说,代码是经过测试的/有效的/你可以复制和粘贴它,等等。不要!这与作者的意图相冲突。(我知道它们是什么!)您的编辑暗示>>I>I