java.io.IOException:请求编写''字节超过''标题中的大小输入字节''

时间:2016-10-03 11:55:26

标签: java apache-commons-io gzipoutputstream

我正在使用tar.Gzip创建一个GZIPOutputStream文件,并且我添加了另一个逻辑,如果在压缩文件时捕获到任何异常,我的代码将重试三次。

当我抛出IOException来测试我的重试逻辑时,它会抛出以下异常:
java.io.IOException: request to write '4096' bytes exceeds size in header of '2644' bytes for entry 'Alldbtypes'

我在第org.apache.commons.io.IOUtils.copyLarge(inputStream, tarStream);

行获得了异常
private class CompressionStream extends GZIPOutputStream {
    // Use compression levels from the deflator class
    public CompressionStream(OutputStream out, int compressionLevel) throws IOException {
        super(out);
        def.setLevel(compressionLevel);
    }
}

public void createTAR(){
    boolean isSuccessful=false;
    int count = 0;
    int maxTries = 3;
    while(!isSuccessful) {
        InputStream inputStream =null;
        FileOutputStream outputStream =null;
        CompressionStream compressionStream=null;
        OutputStream md5OutputStream = null;
        TarArchiveOutputStream tarStream = null;
        try{
            inputStream = new BufferedInputStream(new FileInputStream(rawfile));
            File stagingPath = new File("C:\\Workarea\\6d22b6a3-564f-42b4-be83-9e1573a718cd\\b88beb62-aa65-4ad5-b46c-4f2e9c892259.tar.gz");
            boolean isDeleted = false;
            if(stagingPath.exists()){
                isDeleted =  stagingPath.delete();
                if(stagingPath.exists()){
                    try {
                        FileUtils.forceDelete(stagingPath);
                    }catch (IOException ex){
                        //ignore
                    }
                }
            }
            outputStream = new FileOutputStream(stagingPath);
            if (isCompressionEnabled) {
                compressionStream = new
                        CompressionStream(outputStream, getCompressionLevel(om));
            }
            final MessageDigest outputDigest = MessageDigest.getInstance("MD5");
            md5OutputStream = new DigestOutputStream(isCompressionEnabled ? compressionStream : outputStream, outputDigest);
            tarStream = new TarArchiveOutputStream(new BufferedOutputStream(md5OutputStream));
            tarStream.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
            tarStream.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_STAR);
            TarArchiveEntry entry = new TarArchiveEntry("Alldbtypes");
            entry.setSize(getOriginalSize());
            entry.setModTime(getLastModified().getMillis());
            tarStream.putArchiveEntry(entry);
            org.apache.commons.io.IOUtils.copyLarge(inputStream, tarStream);
            inputStream.close();
            tarStream.closeArchiveEntry();
            tarStream.finish();
            tarStream.close();
            String digest = Hex.encodeHexString(outputDigest.digest());
            setChecksum(digest);
            setIngested(DateTime.now());
            setOriginalSize(FileUtils.sizeOf(stagingPath));
            isSuccessful =true;
        } catch (IOException e) {
            if (++count == maxTries) {
                throw new RuntimeException("Exception: " + e.getMessage(), e);
            }
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(Exception("MD5 hash algo not installed.");
        } catch (Exception e) {
            throw new RuntimeException("Exception: " + e.getMessage(), e);
        } finally {
            org.apache.commons.io.IOUtils.closeQuietly(inputStream);
            try {
                tarStream.flush();
                tarStream.finish();
            } catch (IOException e) {
                e.printStackTrace();
            }
            org.apache.commons.io.IOUtils.closeQuietly(tarStream);
            org.apache.commons.io.IOUtils.closeQuietly(compressionStream);
            org.apache.commons.io.IOUtils.closeQuietly(md5OutputStream);
            org.apache.commons.io.IOUtils.closeQuietly(outputStream);
        }

    }
}

1 个答案:

答案 0 :(得分:4)

案件解决了。当要压缩的文件大小不正确时抛出此异常java.io.IOException: request to write '4096' bytes exceeds size in header of '2644' bytes for entry 'Alldbtypes'

TarArchiveEntry entry = new TarArchiveEntry("Alldbtypes");
entry.setSize(getOriginalSize()); 

在我的代码getOriginalSize()中最后再次更新,因此在重试时原始大小变为原始大小现在压缩文件大小,因此它抛出此异常。