Java 将zip文件编码为Base64,而不在文件系统上写入zip
出于我的目的,我想压缩zip文件夹中的一些文件。然后,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
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