我有一个数据库,在这个数据库中包含blob和一个受密码保护的zip,使用传统上看到的标准File对象方法
File zipFile = new File("C:\\file.zip");
net.lingala.zip4j.core.ZipFile table = new net.lingala.zip4j.core.ZipFile(zipFile);
if (table.isEncrypted())
table.setPassword(password);
net.lingala.zip4j.model.FileHeader entry = table.getFileHeader("file_inside_the_zip.txt");
return table.getInputStream(entry); //Decrypted inputsteam!
我的问题是,如何在不使用临时文件的情况下实现类似的东西,并且纯粹单独获取blob的输入流,到目前为止我有类似的东西
InputStream zipStream = getFileFromDataBase("stuff.zip");
//This point forward I have to save zipStream as a temporary file and use the traditional code above
答案 0 :(得分:0)
我认为通过zip4j是不可能的,因为它非常以文件为中心。
看一下这个:http://blog.alutam.com/2012/03/31/new-library-for-reading-and-writing-zip-files-in-java/
答案 1 :(得分:0)
有一种方法可以通过net.lingala.zip4j.io.inputstream.ZipInputStream实现
(给定一个字节[] zipFile和一个字符串密码)
String zipPassword = "abcabc";
ZipInputStream innerZip = new ZipInputStream(new ByteArrayInputStream(zipFile), zipPassword.toCharArray());
然后您可以遍历未受保护的zip
File zip = null;
while ((zipEntry = zipIs.getNextEntry()) != null) {
zip = new File(file.getAbsolutePath(), zipEntry.getFileName());
....
}
答案 2 :(得分:0)
在Hadoop文件系统(HDFS)中处理受密码保护的压缩文件时,我遇到了同样的问题。 HDFS不了解File对象。
这是使用zip4j对我有用的东西:
createCompanyAuthorizationUi
答案 3 :(得分:0)
public void extractWithZipInputStream(File zipFile, char[] password) throws IOException {
LocalFileHeader localFileHeader;
int readLen;
byte[] readBuffer = new byte[4096];
InputStream inputStream = new FileInputStream(zipFile);
try (ZipInputStream zipInputStream = new ZipInputStream(inputStream, password)) {
while ((localFileHeader = zipInputStream.getNextEntry()) != null) {
File extractedFile = new File(localFileHeader.getFileName());
try (OutputStream outputStream = new FileOutputStream(extractedFile)) {
while ((readLen = zipInputStream.read(readBuffer)) != -1) {
outputStream.write(readBuffer, 0, readLen);
}
}
}
}
}
此方法需要根据您的需要进行修改。例如,您可能必须更改输出位置。我已经尝试过,并且已经奏效。为了更好的理解,请参见https://github.com/srikanth-lingala/zip4j