我查看了JDK和Apache压缩库附带的默认Zip库,我对它们不满意有三个原因:
它们很臃肿,API设计不好.我必须写50行锅炉板字节数组输出,zip输入,文件输出流和关闭相关流并捕获异常并自行移动字节缓冲区?为什么我不能有一个简单的API,它看起来像这样Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null)和Zipper.zip(File targetDirectory, String password = null)刚刚工作的?
它似乎压缩解压缩破坏文件元数据和密码处理被打破.
此外,与我使用UNIX获得的命令行zip工具相比,我尝试的所有库都慢2-3倍?
对我来说(2)和(3)是次要的,但我真的想要一个带有单线界面的良好测试库.
我的应用程序的当前体系结构不允许我在服务器端存储文件并创建指向该存储文件的链接.那么有没有其他选项(或代码片段)直接流ZipFile并将其存储在客户端?
编辑:我想我的问题被误解了.我收到压缩文件的答案并将其存储在客户端.我已经实现了这一点.以下是示例用例的主要关注点:
场景:用户有大约5000条记录(每条大约1 MB),用户希望下载以ZIP格式压缩的每5000条记录的子记录(CSV格式).所有CSV文件都是即时生成的.
方法:由于ZIP文件的大小可以达到5 GB,因此我采用直接将文件内容流式传输到客户端创建的ZIP文件的方法.我已经使用了PipeInputStream和PipeOutputStream.
结果:由于我是vaadin的新手,我在上述方法中没有成功,因此寻找支持将ZIP文件(无论大小可能是直接)流式传输到客户端的任何建议/代码片段.
我想我现在很清楚.
我想重置ZipInputStream(即返回到起始位置),以便按顺序读取某些文件.我怎么做?我被困了......
ZipEntry entry;
ZipInputStream input = new ZipInputStream(fileStream);//item.getInputStream());
int check =0;
while(check!=2){
entry = input.getNextEntry();
if(entry.getName().toString().equals("newFile.csv")){
check =1;
InputStreamReader inputStreamReader = new InputStreamReader(input);
reader = new CSVReader(inputStreamReader);
//read files
//reset ZipInputStream if file is read.
}
reader.close();
}
if(entry.getName().toString().equals("anotherFile.csv")){
check =2;
InputStreamReader inputStreamReader = new InputStreamReader(input);
reader = new CSVReader(inputStreamReader);
//read files
//reset ZipInputStream if file is read.
}
reader.close();
}
}
Run Code Online (Sandbox Code Playgroud)