Erro GZIPInputStream

codigos:

package app;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;

import banco.dao.ContatoDAO;

public class TesteGzip {

	public TesteGzip(){
		
		//ContatoDAO c  = new ContatoDAO();
		
	}
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//System.out.println(new ContatoDAO().obterContatos().length);
		
		ContatoDAO c = new ContatoDAO();
		
		byte[] contatos = c.obterContatos();
		
		System.out.println("size: " + contatos.length);
		
		ByteArrayInputStream bais = new ByteArrayInputStream(contatos);
		GZIPInputStream gzip = new GZIPInputStream(bais);
		BufferedInputStream bis = new BufferedInputStream(gzip);		
		DataInputStream dis = new DataInputStream(bis);
				
		int numReg = c.getNumRegistros(); 
				
		System.out.println("numReg: " + numReg);
		
		for(int i = 0; i < numReg; i++){
			try {				
				System.out.println(dis.readInt());
				System.out.println(dis.readUTF());
				System.out.println(dis.readUTF());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
		}
		
	}

}
package banco.dao;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.zip.GZIPOutputStream;

import banco.BancoUtil;

public class ContatoDAO {
	
	private int numRegistros = 0;
	
	public byte[] obterContatos() {

		byte[] contatos = new byte[200];

		ByteArrayOutputStream baos = null;
		BufferedOutputStream bos = null;
		GZIPOutputStream gzip = null;
		DataOutputStream dos = null;

		BancoUtil b = new BancoUtil();
		Connection con = b.getConexao();

		try {
			PreparedStatement ps = con
					.prepareStatement("select t.id, t.nome, t.endereco from tbl_contato t");
			ResultSet rs = ps.executeQuery();

			baos = new ByteArrayOutputStream();
			gzip = new GZIPOutputStream(baos);
			bos = new BufferedOutputStream(gzip);			
			dos = new DataOutputStream(bos);
			
			while (rs.next()) {
				
				int id = rs.getInt("id");
				String nome = rs.getString("nome");
				String endereco = rs.getString("endereco"); 
				
				System.out.println("id: " + id);
				System.out.println("nome: " + nome);
				System.out.println("endereco: " + endereco);
				
				System.out.println();
				
				dos.writeInt(id);
				dos.writeUTF(nome);
				dos.writeUTF(endereco);
				this.numRegistros++;
				
			}

			baos.flush();
			bos.flush();
			gzip.flush();
			dos.flush();
			

			contatos = baos.toByteArray();

			return contatos;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {

			try {
				baos.close();
				bos.close();
				gzip.close();
				dos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				System.out.println("rox");
				e.printStackTrace();
			}
		}

		return contatos;
	}

	public int getNumRegistros() {
		return numRegistros;
	}
		
}

a saida:

id: 1
nome: chiquim
endereco: nova parnamirim

id: 2
nome: esbf
endereco: nova descoberta

id: 3
nome: gugu
endereco: alecrim

id: 4
nome: cbfs
endereco: candelaria

size: 10
numReg: 4
java.io.EOFException: Unexpected end of ZLIB input stream
	at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:223)
	at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:141)
	at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:92)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
	at java.io.DataInputStream.readInt(DataInputStream.java:370)
	at app.TesteGzip.main(TesteGzip.java:43)

Alguém sabe oq está errado?