0

zip4j用来提取zip文件。对于许多用户来说,这可以正常工作,但Windows 8用户会遇到以下异常:

net.lingala.zip4j.exception.ZipException: net.lingala.zip4j.exception.ZipException: java.lang.IllegalArgumentException: Negative time
    at net.lingala.zip4j.unzip.Unzip.initExtractFile(Unzip.java:163)
    at net.lingala.zip4j.unzip.Unzip.initExtractAll(Unzip.java:83)
    at net.lingala.zip4j.unzip.Unzip.extractAll(Unzip.java:73)
    at net.lingala.zip4j.core.ZipFile.extractAll(ZipFile.java:488)
    at net.lingala.zip4j.core.ZipFile.extractAll(ZipFile.java:451)
    ...

负时间似乎是由文件系统上的文件具有负时间和/或 JVM 错误引起的。有谁知道如何解决这个问题,因为这很奇怪,并且与API我假设的使用无关。

zip4j从那以后就没有维护过,2013所以如果它有一些错误,我不会感到惊讶,但是zip除了这个之外,没有另一个功能更强大的库没有样板JDK。但是,我需要受密码保护的 zip 文件支持,而 JDK 不支持

安装JDK 11并使用它来运行应用程序并不能解决问题,但值得一试。

4

2 回答 2

0

在做了更多研究后,我发现7-Zip-JBinding

<dependency>
    <groupId>net.sf.sevenzipjbinding</groupId>
    <artifactId>sevenzipjbinding</artifactId>
    <version>LATEST</version>
</dependency>
<dependency>
    <groupId>net.sf.sevenzipjbinding</groupId>
    <artifactId>sevenzipjbinding-all-platforms</artifactId>
    <version>LATEST</version>
</dependency>

以下代码可用于提取受密码保护的 zip 文件:

public static void unzipUsing7Zip(String zipFilePath,
                                   String destinationDirectory,
                                   String password) throws IOException
{
    try (val randomAccessFile = new RandomAccessFile(zipFilePath, "r");
         val randomAccessFileInStream = new RandomAccessFileInStream(randomAccessFile);
         val inArchive = openInArchive(null, randomAccessFileInStream))
    {
        val simpleInArchive = inArchive.getSimpleInterface();
        val archiveItems = simpleInArchive.getArchiveItems();

        for (val archiveItem : archiveItems)
        {
            if (!archiveItem.isFolder())
            {
                val archiveItemPath = archiveItem.getPath();
                val targetFilePath = destinationDirectory + separator + archiveItemPath;

                try (val fileOutputStream = new FileOutputStream(targetFilePath))
                {
                    archiveItem.extractSlow(data ->
                    {
                        try
                        {
                            if (archiveItemPath.indexOf(separator) > 0)
                            {
                                // Create parent folder(s)
                                val lastSeparatorIndex = archiveItemPath.lastIndexOf(separator);
                                val path = destinationDirectory + separator + archiveItemPath.substring(0, lastSeparatorIndex);
                                createDirectories(Paths.get(path));
                            }

                            fileOutputStream.write(data);
                        } catch (Exception exception)
                        {
                            exception.printStackTrace();
                        }

                        return data.length;
                    }, password);
                }
            }
        }
    }
}

基于此处,FileOutputStream但已通过添加清理和真实文件提取代码。

附加说明:当然val来自lombok

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>LATEST</version>
    <scope>provided</scope>
</dependency>
于 2018-11-12T14:41:17.160 回答
0

我发现问题是当前时间最新的文件修改时间。格式不匹配。你可以用这个检查:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");  
LocalDateTime now = LocalDateTime.now();  
System.out.println(dtf.format(now));  

File file = new File("folder/source.zip");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
System.out.println(sdf.format(file.lastModified()));

然后在您的区域设置>>区域格式>>英语(美国)中设置您的格式

于 2019-12-26T02:42:41.883 回答