有时候我们需要在内存里直接对InputStream进行压缩,而不用在磁盘生成压缩文件。
import部分:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
代码:
public static void main(String[] args) {
String str = "你好!现在在测试通过inputstream生成压缩文件"; //文件的内容
InputStream input = new ByteArrayInputStream(str.getBytes()); // String 对inputStream的转换
// 在内存生成压缩文件
compressFileOnMemoryByInputStream(input);
}
public static void compressFileOnMemoryByInputStream(InputStream input) {
ZipOutputStream zipOS = null;
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] byteBuffer = new byte[1024 * 4];
zipOS = new ZipOutputStream(output);
try {
zipOS.putNextEntry(new ZipEntry("testFile001")); // 这个是压缩包里子文件的名字,必要有
int n = 0;
while (-1 != (n = input.read(byteBuffer))) {
zipOS.write(byteBuffer, 0, n);
}
// 下面这句很重要,没有这句无法打开压缩包
zipOS.finish();
// 额外的,我们可以对整个压缩包进行base64转码,传给前端
String base64Archive = Base64.getEncoder().encodeToString(output.toByteArray());
System.out.println("base64Archive=" + base64Archive);
// TODO 把压缩文件写到磁盘中测试是否正确
String pathStr = "E:\\Test_JAVAProgram\\test7z\\archive\\test_File.zip";
Path path = Paths.get(pathStr);
Files.write(path, output.toByteArray());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
zipOS.closeEntry(); // 关闭entry
} catch (Exception e) {
e.printStackTrace();
}
if (zipOS != null) {
try {
zipOS.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (output != null) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}