无需在 Java 或 Python 中解压缩即可从 ZIP 存档中删除文件

Sea*_*Dav 5 python java zip

从 ZIP 存档中删除文件而不使用 Java(首选)或 Python 解压缩

你好,

我使用包含数百个高度压缩的文本文件的大型 ZIP 文件。当我解压缩 ZIP 文件时,它可能需要一段时间并且很容易消耗多达 20 GB 的磁盘空间。我想从这些 ZIP 文件中删除某些文件,而不必仅解压缩和重新压缩我想要的文件。

当然,这样做当然是可能的,但效率很低。

我更喜欢用 Java 来做这件事,但会考虑 Python

Val*_*len 6

我在网上找到了这个

仅包含标准库的干净解决方案,但我不确定它是否包含在 android sdk 中,无法找到。

import java.util.*;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.*;
import java.nio.file.StandardCopyOption;
public class ZPFSDelete {
    public static void main(String [] args) throws Exception {

        /* Define ZIP File System Properies in HashMap */    
        Map<String, String> zip_properties = new HashMap<>(); 
        /* We want to read an existing ZIP File, so we set this to False */
        zip_properties.put("create", "false"); 

        /* Specify the path to the ZIP File that you want to read as a File System */
        URI zip_disk = URI.create("jar:file:/my_zip_file.zip");

        /* Create ZIP file System */
        try (FileSystem zipfs = FileSystems.newFileSystem(zip_disk, zip_properties)) {
            /* Get the Path inside ZIP File to delete the ZIP Entry */
            Path pathInZipfile = zipfs.getPath("source.sql");
            System.out.println("About to delete an entry from ZIP File" + pathInZipfile.toUri() ); 
            /* Execute Delete */
            Files.delete(pathInZipfile);
            System.out.println("File successfully deleted");   
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)


Sea*_*Dav 0

好吧,我想我从 www.javaer.org 找到了一个潜在的解决方案。它肯定会删除 zip 内的文件,而且我不认为它会解压缩任何内容。这是代码:

public static void deleteZipEntry(File zipFile,
     String[] files) throws IOException {
       // get a temp file
File tempFile = File.createTempFile(zipFile.getName(), null);
       // delete it, otherwise you cannot rename your existing zip to it.
tempFile.delete();
tempFile.deleteOnExit();
boolean renameOk=zipFile.renameTo(tempFile);
if (!renameOk)
{
    throw new RuntimeException("could not rename the file "+zipFile.getAbsolutePath()+" to "+tempFile.getAbsolutePath());
}
byte[] buf = new byte[1024];

ZipInputStream zin = new ZipInputStream(new FileInputStream(tempFile));
ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(zipFile));

ZipEntry entry = zin.getNextEntry();
while (entry != null) {
    String name = entry.getName();
    boolean toBeDeleted = false;
    for (String f : files) {
        if (f.equals(name)) {
            toBeDeleted = true;
            break;
        }
    }
    if (!toBeDeleted) {
        // Add ZIP entry to output stream.
        zout.putNextEntry(new ZipEntry(name));
        // Transfer bytes from the ZIP file to the output file
        int len;
        while ((len = zin.read(buf)) > 0) {
            zout.write(buf, 0, len);
        }
    }
    entry = zin.getNextEntry();
}
// Close the streams        
zin.close();
// Compress the files
// Complete the ZIP file
zout.close();
tempFile.delete();
Run Code Online (Sandbox Code Playgroud)

}

  • ZipOutputStream 重新创建文件,因此它会解压缩所有内容并将其压缩回来。我想知道您是否了解有关代码的任何信息,临时文件在前方数英里处可见。每次只读取 1024 字节也是特别低效的。 (4认同)