如何在java中的zip文件中提取特定文件

Mr *_*ain 7 java zip

我需要在系统中向客户提供zip文件的视图,并允许客户下载选择的文件.

  1. 解析zip文件并在网页上显示.并记住后端的每个zipentry位置(例如file1从字节100宽度长度1024字节开始).
  2. 客户单击下载按钮时下载指定的文件.

现在我已经记住了所有的zipentry位置,但有没有java zip工具来解压缩zip文件的指定位置?API就像解压缩(file,long entryStart,long entryLength);

Ami*_*ati 10

您可以使用以下代码从zip中提取特定文件: -

public static void main(String[] args) throws Exception{
        String fileToBeExtracted="fileName";
        String zipPackage="zip_name_with_full_path";
        OutputStream out = new FileOutputStream(fileToBeExtracted);
        FileInputStream fileInputStream = new FileInputStream(zipPackage);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream );
        ZipInputStream zin = new ZipInputStream(bufferedInputStream);
        ZipEntry ze = null;
        while ((ze = zin.getNextEntry()) != null) {
            if (ze.getName().equals(fileToBeExtracted)) {
                byte[] buffer = new byte[9000];
                int len;
                while ((len = zin.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
                out.close();
                break;
            }
        }
        zin.close();

    }
Run Code Online (Sandbox Code Playgroud)

另请参阅此链接:如何从远程存档文件中提取单个文件?

  • 它仅适用于一种情况,即每个条目标头中保存了 compressSize 和原始条目大小。但是有些 zip 文件并没有将这些信息保存在条目头中,在这种情况下,zin.getNextEntry() 将读取前一个条目的数据以到达下一个条目而不是寻找下一个条目,因此它会执行得很慢。 (2认同)

Thu*_*rge 10

这可以在不使用Java 7的NIO2处理字节数组或输入流的情况下完成:

public void extractFile(Path zipFile, String fileName, Path outputFile) throws IOException {
    // Wrap the file system in a try-with-resources statement
    // to auto-close it when finished and prevent a memory leak
    try (FileSystem fileSystem = FileSystems.newFileSystem(zipFile, null)) {
        Path fileToExtract = fileSystem.getPath(fileName);
        Files.copy(fileToExtract, outputFile);
    }
}
Run Code Online (Sandbox Code Playgroud)


Gar*_*rry 5

您可以这样尝试:

ZipFile zf = new ZipFile(file);
try {
  InputStream in = zf.getInputStream(zf.getEntry("file.txt"));
  // ... read from 'in' as normal
} finally {
  zf.close();
}
Run Code Online (Sandbox Code Playgroud)

我还没有尝试过,但是在Java 7 ZipFileSystem中,您可以像这样从zip文件中提取file.TXT文件。

Path zipfile = Paths.get("/samples/ziptest.zip");
FileSystem fs = FileSystems.newFileSystem(zipfile, env, null);
final Path root = fs.getPath("/file.TXT");
Run Code Online (Sandbox Code Playgroud)