我想确定我的存档文件是zip
还是rar
。但是我在验证文件之前遇到运行时错误的问题。我想创建自定义通知:
public class ZipValidator {
public void validate(Path pathToFile) throws IOException {
try {
ZipFile zipFile = new ZipFile(pathToFile.toFile());
String zipname = zipFile.getName();
} catch (InvalidZipException e) {
throw new InvalidZipException("Not a zip file");
}
}
}
目前,我有运行时错误:
最佳答案
我建议打开一个普通的InputStream读取前几个字节(魔术字节),而不要依赖文件扩展名,因为这很容易被欺骗。另外,您可以省略创建和解析文件的开销。
对于RAR,首字节应为 52 61 72 21 1A 07 。
对于ZIP,它应该是以下之一:
资料来源:https://en.wikipedia.org/wiki/List_of_file_signatures
还有一点,只是看一下您的代码:
为什么要捕获InvalidZipException并扔掉它并构造一个新的呢?这样,您将丢失原始异常中的所有信息,从而难以调试和理解到底出了什么问题。要么根本就不要捉住它,或者如果必须将其包装起来,就对它做对:
} catch (InvalidZipException e) {
throw new InvalidZipException("Not a zip file", e);
}