zip4j,从输入流中提取受密码保护的文件(blob inputstream是一个zip文件)

时间:2016-08-30 07:00:08

标签: java zip4j

我有一个数据库,在这个数据库中包含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

4 个答案:

答案 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