我正在尝试压缩一个文件(例如foo.csv),并将其上传到服务器。 我有一个可用的版本,它创建一个本地副本,然后删除该本地副本。 如何压缩文件,以便可以在不写入硬盘的情况下仅使用内存发送它?
我正在尝试压缩一个文件(例如foo.csv),并将其上传到服务器。 我有一个可用的版本,它创建一个本地副本,然后删除该本地副本。 如何压缩文件,以便可以在不写入硬盘的情况下仅使用内存发送它?
使用 ByteArrayOutputStream 和 ZipOutputStream 完成任务。
可以使用 ZipEntry 来指定要包含在 zip 文件中的文件。
以下是使用上述类的示例,
String s = "hello world";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try(ZipOutputStream zos = new ZipOutputStream(baos)) {
/* File is not on the disk, test.txt indicates
only the file name to be put into the zip */
ZipEntry entry = new ZipEntry("test.txt");
zos.putNextEntry(entry);
zos.write(s.getBytes());
zos.closeEntry();
/* use more Entries to add more files
and use closeEntry() to close each file entry */
} catch(IOException ioe) {
ioe.printStackTrace();
}
现在,baos
以 stream
的形式包含了你的 zip 文件。
<dependency>
<groupId>org.softsmithy.lib</groupId>
<artifactId>softsmithy-lib-core</artifactId>
<version>0.4</version>
</dependency>
public byte[] compressZip(ByteArrayOutputStream baos,String entryName) throws IOException {
try (final ByteArrayOutputStream zipBaos = new ByteArrayOutputStream();
final java.util.zip.ZipOutputStream out = new ZipOutputStream(zipBaos)) {
final ZipEntry zipEntry = new ZipEntry(entryName);
zipEntry.setSize(baos.size());
out.putNextEntry(zipEntry);
IOUtils.copy(new ByteArrayInputStream(baos.toByteArray()), out);
out.closeEntry();
out.finish();
out.flush();
return zipBaos.toByteArray();
}
}
getBytes
操作之前,请记得先关闭 ZipOutputStream。 - hencrice