问题
I want to identify my archive whether it is zip
or rar
. But the problem I get runtime error before I can validate my file. I want to create custom notification:
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");
}
}
}
At the moment I have runtime error:
java.util.zip.ZipException: error in opening zip file
回答1:
I'd suggest to open a plain InputStream an reading the first few bytes (magic bytes) and not to rely on the file extension as this can be easily spoofed. Also, you can omit the overhead creating and parsing the files.
For RAR the first bytes should be 52 61 72 21 1A 07.
For ZIP it should be one of:
- 50 4B 03 04
- 50 4B 05 06 (empty archive)
- 50 4B 07 08 (spanned archive).
Source: https://en.wikipedia.org/wiki/List_of_file_signatures
Another point, just looked at your code:
Why do you catch die InvalidZipException, throw it away and construct a new one? This way you lose all the information from the original exception, making it hard to debug and understand what exactly went wrong. Either don't catch it at all or, if you have to wrap it, do it right:
} catch (InvalidZipException e) {
throw new InvalidZipException("Not a zip file", e);
}
回答2:
Merging the answers of nanda & bratkartoffel.
private static boolean isArchive(File f) {
int fileSignature = 0;
try (RandomAccessFile raf = new RandomAccessFile(f, "r")) {
fileSignature = raf.readInt();
} catch (IOException e) {
// handle if you like
}
return fileSignature == 0x504B0304 || fileSignature == 0x504B0506 || fileSignature == 0x504B0708;
}
回答3:
RandomAccessFile raf = new RandomAccessFile(f, "r");
long n = raf.readInt();
raf.close();
if (n == 0x504B0304)
System.out.println("Should be a zip file");
else
System.out.println("Not a zip file");
You can see it in the following link. http://www.coderanch.com/t/381509/java/java/check-file-zip-file-java
回答4:
Exception is thrown in line
ZipFile zipFile = new ZipFile(pathToFile.toFile());
That's because if a non-ZipFile is given as parameter for the ZipFile
constructor the ZipException
is thrown.
So you have to check before generating a new ZipFile
Object if your file path points to a correct ZipFile
.
One solution might be to check the extension of the file path like so
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.zip");
boolean extensionCorrect = matcher.matches(path);
来源:https://stackoverflow.com/questions/33934178/how-to-identify-a-zip-file-in-java