Как найти поврежденный файл gz в Java

Я должен распаковать файл.gz, для которого я использую следующий код:

FileInputStream fis = null;
        FileOutputStream fos = null;
        GZIPInputStream gin = null;
        try {
            File file = new File(getPath(), zipName);
            fis = new FileInputStream(file);
            gin = new GZIPInputStream(fis);
            File newFile = // some initialization related to path and name
            fos = new FileOutputStream(getPath());
            byte[] buf = new byte[1024];
            int len;
            while ((len = gin.read(buf)) > 0) {
                fos.write(buf, 0, len);
            }
            gin.close();
            fos.close();

        //newFile is ready
        } catch(IOException e){
                // exception catch
        }

Однако, когда файл gz клиента поврежден, я получаю следующую ошибку:

  Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
    at java.util.zip.InflaterInputStream.fill(Unknown Source)
    at java.util.zip.InflaterInputStream.read(Unknown Source)
    at java.util.zip.GZIPInputStream.read(Unknown Source)
    at java.util.zip.InflaterInputStream.read(Unknown Source)

Удивительно, но файл все еще распаковывается и хранится в локальном каталоге. Я не хочу, чтобы поврежденный файл был разархивирован или обработан вообще.

Одним из способов может быть удаление объекта newFile, когда предложение catch отмечено java.io.EOFException, но это правильный подход? Могут быть и другие возможные исключения, когда файл не поврежден.

1 ответ

Решение

Ссылка @EJP

Если по какой-либо причине вы получаете какое-либо исключение IOException от поврежденного ввода до диска, летящего по орбите вокруг Плутона, вы должны удалить выходной файл и рассматривать операцию как неудачную. Вам не нужно думать дальше. - EJP

Другие вопросы по тегам