作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的网络应用程序允许用户上传 JAR 文件。但是,上传 jar 文件后,它已损坏。我已经通过比较上传文件前后的 MD5 校验和验证了这一点 (winmd5free)。
上传的jar文件和原来的几乎一模一样:
当我打开上传的 jar 文件(使用 Notepad++)时,我确实注意到二进制内容与原始内容不同。此外,当我使用 JarInputStream
读取 JAR 条目时,没有任何条目。
JarInputStream is = new JarInputStream(new FileInputStream(new File("uploaded.jar")));
JarEntry entry = null;
while(null != (entry = is.getNextJarEntry())) {
System.out.println(entry.getName());
}
此外,当我双击 jar (Windows) 时,我收到以下消息。
Error: Invalid or corrupt jarfile
我的问题是:
JarInputStream
会立即检测到这一点,但它没有显示任何问题java -cp uploaded.jar;libs\* com.some.class.Test
命令?这个问题与 jar 签名和/或检查 JAR 文件的签名无关。它只是检查文件(上传与否)是否是有效的 JAR 文件(不一定是 jar 的类文件是否有效,因为已经有关于此问题的另一篇 SO 帖子)。
我运行 jar -tvf uploaded.jar
的结果:
java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:127)
at java.util.zip.ZipFile.<init>(ZipFile.java:88)
at sun.tools.jar.Main.list(Main.java:977)
at sun.tools.jar.Main.run(Main.java:222)
at sun.tools.jar.Main.main(Main.java:1147)
最佳答案
以编程方式检测无效 jar 文件的一种方法是使用 java.util.ZipFile
。
public static void main(String[] args) {
if(args.length < 1) {
System.err.println("need jar file");
return;
}
String pathname = args[0];
try {
ZipFile file = new ZipFile(new File(pathname));
Enumeration<? extends ZipEntry> e = file.entries();
while(e.hasMoreElements()) {
ZipEntry entry = e.nextElement();
System.out.println(entry.getName());
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
如果 jar 文件无效,则在实例化 ZipFile
对象时将抛出 ZipException
。
关于java - 如何检查 JAR 文件是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20152195/
我是一名优秀的程序员,十分优秀!