GZipInputstream wirft ZipException

  • Ich hatte unter Java:

    Java
    ByteArrayInputStream is = new ByteArrayInputStream(gzippedByteArray);
    GZIPInputStream gis = new GZIPInputStream(is, 32);
    StringBuilder stringBuilder = new StringBuilder();
    byte[] data = new byte[32];
    int bytesRead;
    while ((bytesRead = gis.read(data)) != -1) {
          stringBuilder.append(new String(data, 0, bytesRead));
    }
    gis.close();
    is.close();


    was ich nach Kotlin umgewandelt habe:

    Java
    val `is` = ByteArrayInputStream(this.toByteArray(Charsets.UTF_8))
    val gis = GZIPInputStream(`is`, 32)
    val string = StringBuilder()
    val data = ByteArray(32)
    var bytesRead: Int
    while (gis.read(data) != -1) {
        string.append(String(data))
    }
    gis.close()
    `is`.close()

    Aber irgendwie wirft es immer eine
    java.util.zip.ZipException: Not in GZIP format ?!


    Jemand einen Hinweis was ich falsch mache?


    Thnx und gruß
    T

  • Hallo
    eine Frage was soll 'is' denn sein glaube nicht das ein bezeichner mit einen ( ' ) anfangen darf.
    Ich denke auch das "data" ein var sein müsste, denn du willst doch doch immer wieder Daten in deiner while Schleife rein schreiben.




    Ok ‚is‘ geht, Kotlin akzeptier auch dieses Zeichen für Bezeichner.
    Auch sollte das mit dem val bei data ok sein denn es ist ja ein Objekt (Klasse Instanz).



    Aber mit den this bei val `is` = ByteArrayInputStream(this.toByteArray(Charsets.UTF_8))


    bin ich nicht ganz ein verstanden.
    Ich denke du hast keine Member Funktion mit dem Namen die einen Buffer zrückgibt.



    Du willst doch einen Buffer in ein Zip Objekt haben oder? Wo ist dein Buffer den ByteArrayInputStream haben will?



    du brauchst einen Buffer, String … den du übergiebst und mit toBytArray zu einen ByteArray machst.



    var buf = "hallo"
    val `is` = ByteArrayInputStream(buf.toByteArray(Charsets.UTF_8)) zB.


    oder wie in den Java teil übergebe gleich den Buffer der bei dier wohl gzippedByteArray heißt.


    val `is` = ByteArrayInputStream(gzippedByteArray)
    val `is` = ByteArrayInputStream(gzippedByteArray.toByteArray(Charsets.UTF_8))


    Die Syntax ist wirklich Gewöhnungsbedürftig muss da auch immer erst dreimal um die Ecke Denken.


    Hoffe das Hilft weiter.

  • versuche es mal in etwa so

    Code
    // var gzippedByteArray  = ByteArray(100)
    
    
    
    
    val gis = GZIPInputStream(gzippedByteArray.inputStream())
    val buf = gis.bufferedReader(UTF_8)
    val data={buf : BufferedReader -> buf.readText() }

    Jupp, habe:

    Java
    fun ByteArray.unzip(): String =
                    GZIPInputStream(this.inputStream()).bufferedReader(UTF_8).use { it.readText() }

    und bekomme nun java.util.zip.ZipException: invalid bit length repeat

  • Hi was hast du immer mit deinen this ?
    Du willst einer Klasse eine Methode hinzufügen, erweitern.



    Da würde mich mal dein Aufruf der neuen Methode Interessieren.


    Wenn du es in einer kompakten Funktion haben willst dann bitte so.




    Code
    fun unzip(zipArray: ByteArray): String =
            GZIPInputStream(zipArray.inputStream()).bufferedReader(UTF_8).use { it.readText() }
  • Hi was hast du immer mit deinen this ?
    Du willst einer Klasse eine Methode hinzufügen, erweitern.

    Das war eine extension function auf ByteArray, mit this referenziert man das aufrufende Objekt in einer Extension function:


    Code
    fun ByteArray.foo(){
       //..this ist mein Aufrufendes ByteArray
       println(this.size)
    }
    //..
    val myByteArray = {1,1,1} as ByteArray
    myByteArray.foo() // 3

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!