Java 最小的合法zip/jar文件是什么?

Java 最小的合法zip/jar文件是什么?,java,exception,jar,zip,Java,Exception,Jar,Zip,我讨厌为我可以用if语句简单测试的东西生成异常。我知道,如果您尝试使用java.util.zip/java.util.jar API访问零长度zip/jar,它将触发异常。因此,这些实用程序API似乎应该能够处理一个最小的文件。您真的应该将此类代码放入try/catch中,因为在读取/写入文件时可能会出现很多问题 如果你真的必须知道这个问题的答案,那么试着在zip文件中添加一个1字节的文件,然后看看是否失败?代码很容易通过1->65536字节的大小范围添加到zip并查看哪些失败?Jar文件需要至

我讨厌为我可以用if语句简单测试的东西生成异常。我知道,如果您尝试使用java.util.zip/java.util.jar API访问零长度zip/jar,它将触发异常。因此,这些实用程序API似乎应该能够处理一个最小的文件。

您真的应该将此类代码放入try/catch中,因为在读取/写入文件时可能会出现很多问题


如果你真的必须知道这个问题的答案,那么试着在zip文件中添加一个1字节的文件,然后看看是否失败?代码很容易通过1->65536字节的大小范围添加到zip并查看哪些失败?

Jar文件需要至少有一个条目。如果您想创建一个空的,那么只创建一个清单jar


有关jar清单的更多信息,请参阅。

根据ZIP文件格式,ZIP文件至少应具有46字节长+3个变量字段的中心目录结构(请自行检查规范)


也许我们应该假设至少有一个条目表示该条目的文件头。

最小的合法zip包含零个条目,以及一个“空”的中心目录

字节为:

 80 75 05 06 
后跟18个字节的零(0)

因此,22字节长

要创建它,请执行以下操作:

Sub NewZip(pathToZipFile)

    WScript.Echo "Newing up a zip file (" & pathToZipFile & ") "

    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim file
    Set file = fso.CreateTextFile(pathToZipFile)

    file.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, 0)
    file.Close

    Set fso = Nothing
    Set file = Nothing
    WScript.Sleep 500
End Sub


NewZip "Empty.zip"

我编写了一个快速测试,我可以创建并使用java.util.zip API读回的最小zip是118字节。有一种方法可以创建一个更小的zip文件,该文件符合规范,并且可以通过zip实用程序读取

(PlugIn/WebStart将拒绝任何不以条目标题幻数开头的zip/jar(用于防止收到礼物)。)不,最小的合法/有效zip文件是22字节:
80 75 05 06 00 00 00
。不过,我不知道jar文件。@Cheeso,zip不是应该以
PK
开头吗。。。这里的
8075
不是…:S@DimitryK-这些值是十进制的。P=80k=75。@billpg我想应该是十六进制的,反之亦然?代码在try/catch块中。不过,我不喜欢编写使用异常来捕获可测试条件的代码。如果您认为检查zip大小是错误的,那么您的代码一定很糟糕。让zip类做他们自己的事情,让他们通过异常来抱怨。因此,看起来最小的合法zip文件将比最小的合法jar小?这可能适用于zip程序,但对于java.util.zip.*API来说似乎是不可接受的。
final static byte[] EmptyZip={80,75,05,06,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00};
public static void createEmptyZip(String path){
    try{
        FileOutputStream fos=new FileOutputStream(new File(path));
        fos.write(EmptyZip, 0, 22);
        fos.flush();
        fos.close();
    }catch (FileNotFoundException e){
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}