Avatar billede obix Nybegynder
27. januar 2006 - 15:38 Der er 8 kommentarer og
1 løsning

Out of memory exception ved unzip

Hej Eksperter.
Jeg har lavet denne unzip metode men hvis filen jeg prøver at unzippe ikke er valid så får jeg en out of memory exception fordi den bliver ved med at loope. Koden kommer her.
public static byte[] unZipData(byte[] input) throws Exception {
//Create the decompressor and give it the data to compress
Inflater decompressor = new Inflater();
decompressor.setInput(input);

// Create an expandable byte array to hold the decompressed data
ByteArrayOutputStream bos2 = new ByteArrayOutputStream(input.length);

// Decompress the data
byte[] buf2 = new byte[1024];
while (!decompressor.finished()) {
try {
int count = decompressor.inflate(buf2);
bos2.write(buf2, 0, count);
} catch (DataFormatException e) {
throw e;
}
}
try {
bos2.close();
} catch (IOException e) {
}

// Get the decompressed data
return bos2.toByteArray();
}
Avatar billede obix Nybegynder
27. januar 2006 - 15:40 #1
Jeg har fundet dette http://forum.java.sun.com/thread.jspa?forumID=4&messageID=1683180&threadID=389668

og har forsøgt mig med følgende

public static byte[] unZipData(byte[] input) throws Exception {

        // Get the decompressed data
        //return bos2.toByteArray();

       
        // Decompress the bytes
        Inflater decompresser = new Inflater();
        decompresser.setInput(input, 0, input.length*10);
        byte[] result = new byte[decompresser.getTotalOut()];
       
        int resultLength = 0;
        try {
        resultLength = decompresser.inflate(result);
        }
        catch ( DataFormatException e ) {
            System.out.println("msg=" + e.getMessage() );
        }
        decompresser.end();
        return result;
    }

Men som i kan se så hardcoder jeg hvor stor jeg tror den unzippede fil bliver. Kan man komme omkring det?
Avatar billede callisen Nybegynder
30. januar 2006 - 17:26 #2
Jeg har dog ikke testede det, men ifølge javadoc så vil burde man kunne gøre det på følgende måde. Dog ved jeg ikke om det er den mest bedste måde. Det minder meget om det du startede med.

public static byte[] unZipData(byte[] input) throws Exception {
    Inflater decompresser = new Inflater();
    // Create an expandable byte array to hold the decompressed data
    // It starts with 32 bytes but will expand if needed
    ByteArrayOutputStream result = new ByteArrayOutputStream();

    decompresser.setInput(input, 0, input.length);
    int resultLength = decompresser.inflate(result.toByteArray());
    decompresser.end();

    return result.toByteArray();
    /* check evt.
    http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/Inflater.html
    */
}
Avatar billede callisen Nybegynder
30. januar 2006 - 18:42 #3
virker det?
Avatar billede obix Nybegynder
31. januar 2006 - 08:44 #4
Nej det virker ikke.

Jeg tror måske det er her kæden hopper af

decompresser.inflate(result.toByteArray());
Avatar billede arne_v Ekspert
01. februar 2006 - 02:31 #5
package january;

import java.util.zip.*;

public class Unzip {
    public static byte[] zipData(byte[] input) {
        Deflater comp = new Deflater();
        comp.setInput(input);
        comp.finish();
        byte[] tmp = new byte[2*input.length];
        int n = comp.deflate(tmp);
        byte[] b = new byte[comp.getTotalOut()];
        System.arraycopy(tmp, 0, b, 0, n);
        return b;
    }
    public static byte[] unzipData(byte[] input) throws DataFormatException {
        Inflater decomp = new Inflater();
        decomp.setInput(input);
        byte[] tmp = new byte[20*input.length];
        int n = decomp.inflate(tmp);
        byte[] b = new byte[decomp.getTotalOut()];
        System.arraycopy(tmp, 0, b, 0, n);
        return b;
    }
    public static void main(String[] args) throws Exception {
        String s = "Dette er en test - test test test test test !";
        byte[] b1 = s.getBytes();
        byte[] b2 = zipData(b1);
        byte[] b3 = unzipData(b2);
        System.out.println(b1.length + "->" + b2.length + "->" + b3.length);
        System.out.println(new String(b3));
        byte[] b4 = { 0x00, 0x01, 0x02, 0x03, 0x04 };
        byte[] b5 = unzipData(b4);
        System.out.println(new String(b5));
    }
}

giver

45->30->45
Dette er en test - test test test test test !
Exception in thread "main" java.util.zip.DataFormatException: unknown compression method
    at java.util.zip.Inflater.inflateBytes(Native Method)
    at java.util.zip.Inflater.inflate(Inflater.java:219)
    at java.util.zip.Inflater.inflate(Inflater.java:236)
    at january.Unzip.unzipData(Unzip.java:20)
    at january.Unzip.main(Unzip.java:33)

hvilker ser meget korrekt ud for mig
Avatar billede arne_v Ekspert
12. marts 2006 - 05:29 #6
Kommet videre ?
Avatar billede arne_v Ekspert
22. april 2006 - 23:29 #7
??
Avatar billede obix Nybegynder
25. april 2006 - 22:02 #8
Hej Arne.
Ja vi er kommet videre. Den OOM fejl vi fik skyldtes ikke vores unzip metode men at nogle objecter ikke kunne blive garbage collectet. Så vores zip metoder fungerede udemærket.

Har du egentlig en email adresse hvor jeg lige kan skrive et spørgsmål til dig?
Det er en betalbar ydelse jeg vil høre om du er interesseret i.
Du kan skrive til mig på bille_ole@hotmail.com

Vil du poste et svar så jeg kan give points.
Avatar billede arne_v Ekspert
25. april 2006 - 22:34 #9
svar

arne_v@mail.danbbs.dk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester