Java中实现gzip完整性校验
对于类似于“gzip -t
利用gzipinputstream和fileoutputstream
常用的方法是使用gzipinputstream和fileoutputstream组合来解压gzip文件,该方法会自动执行完整性校验:
立即学习“Java免费学习笔记(深入)”;
public static void decompressgzip(file input, file output) throws ioexception, zipexception { try (gzipinputstream in = new gzipinputstream(new fileinputstream(input))) { try (fileoutputstream out = new fileoutputstream(output)) { byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } } } }
如果gzip文件不完整,则会抛出zipexception异常。
使用outputstream.nulloutputstream()
另一种方法是使用outputstream.nulloutputstream()来模拟“gzip -t”命令的行为。通过将gzip数据流输出到这个流中,并检查是否抛出异常,即可实现完整性校验:
public static boolean checkGzipIntegrity(File input) throws IOException { try (GZIPInputStream in = new GZIPInputStream(new FileInputStream(input))) { OutputStream out = OutputStream.nullOutputStream(); // Java >= 11 try (OutputStream out = new OutputStream() { @Override public void write(int b) { // 不执行任何写入操作 } }) { byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } } return true; } catch (ZipException e) { return false; } }