Serialização / Zip

2 respostas
M

Estou fazendo uns testes com relação a serialização com posterior compressão dos dados.

package teste;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 *
 * @author Magno
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        A a = new A();
        a.x = 10;
        a.b = new B();
        a.b.a = a;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(baos);
        zos.putNextEntry(new ZipEntry("teste"));
        ObjectOutputStream oos = new ObjectOutputStream(zos);
        oos.writeObject(a);

        byte[] buf = baos.toByteArray();
        ByteArrayInputStream bais = new ByteArrayInputStream(buf);
        ZipInputStream zis = new ZipInputStream(bais);
        zis.getNextEntry();
        ObjectInputStream ois = new ObjectInputStream(zis);

        A a2 = (A)ois.readObject();
        System.out.println(a2.x);
        System.out.println(a2 == a2.b.a);
    }

}

class A implements Serializable {
    int x;
    B b;
}

class B implements Serializable {
    A a;
}
Mas estou recebendo o seguinte erro:
Exception in thread "main" 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.ZipInputStream.read(ZipInputStream.java:146)
        at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266)
        at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
        at teste.Main.main(Main.java:37)

Alguem aqui sabe o que fiz de errado?

2 Respostas

M

Faltou um close no ObjectOutputStream antes de ler o array de bytes… obrigado

KWill

Por mim, tá faltando chamar os métodos “closeEntry” e “finish” da classe “ZipOutputStream”.

Inté.

Criado 26 de julho de 2009
Ultima resposta 26 de jul. de 2009
Respostas 2
Participantes 2