Input/Output decompressingInputStream

montii

Mitglied
Hallo,

ich möchte mir einen Stream "basteln" der zuvor Kompremierte Bytes wieder dekomprimiert. Das Komprieren soll nach dem "run length encoding" stattfinden.

Beispiel:

Aus {-1, 5, 5, 5} wird { -1, -1, -1, 5, 3 }. Eine -1 wird zu 2 aufeinander folgende -1, der Anfang einer Bitfolge (eine Art Sequenz) wird auch mit einer -1 dargestellt. Als nächstes käme das Bit an sich und als 3. die Anzahl der Bits.

Nun zum eigentlichem Problem. Ich überschreibe die read() Methode des Input Streams wie folgt:

Java:
public class DecompressingInputStream extends InputStream {
    final byte SPECIAL_BYTE = -1;
    final int SEQUENCE_LENGTH = 3;
    private int countNumber = 0;
    private final InputStream in;
    private byte returnNumber;

    public DecompressingInputStream(InputStream in) {
        this.in = in;
    }

    @Override
    public int read() throws IOException {
        if (countNumber > 0) {
            countNumber--;
            return returnNumber;
        }

        int nextInt = (int) in.read();
        if (nextInt == -1) {
            return -1;
        }

        byte nextByte = (byte) nextInt;

        if (nextByte == SPECIAL_BYTE) {
            nextInt = (int) in.read();
            nextByte = (byte) nextInt;
            if (nextByte == SPECIAL_BYTE) {
                return nextByte;
            } else {
                nextInt = in.read();
                if (nextInt == -1) {
                    return -1;
                }
                returnNumber = nextByte;
                countNumber = nextInt - 1;
            }
        }
        return nextByte;
    }

Wenn ich mir Testweise eine Testklasse schreibe, bricht diese innerhalb der Schleife ab da -1 zurückgeben wird. Mir wurde aber erzählt, dass der Compiler selber erkennt ob ein Byte oder Integer Wert zurückgeben wird, daher müsste das ganz doch so klappen?

Testklasse:

Java:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class main {
    public static void main(String[] args) throws IOException {

        byte[] input = { 0, 1, 1, 1, 1, 1, 1 };
        byte[] output = { -1, -1, -1, 5, 3 };
        byte[] decomp;

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        CompressingOutputStream cos = new CompressingOutputStream(bos);
        ByteArrayInputStream bis = new ByteArrayInputStream(output);
        DecompressingInputStream is = new DecompressingInputStream(bis);

        cos.write(input);
        cos.close();
        int daten;
        byte b;
        while ((daten = is.read()) != -1) {
            b = (byte) daten;
            System.out.print(daten + " ");
        }
        is.close();

    }

    public static void arrayGedöns(byte[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
}
 
S

SlaterB

Gast
> Mir wurde aber erzählt, dass der Compiler selber erkennt ob ein Byte oder Integer Wert zurückgeben wird, daher müsste das ganz doch so klappen?

kannst du nicht gleich dazuschreiben, was du damit meinst? eine -1 ist eine -1, egal ob als byte oder int, jedenfalls im normalen Java,
die Streams passen bisschen mehr auf, da -1 eine besondere Bedeutung hat, wird dann in byte 255 abgeändert,

du machst das mit deiner DecompressingInputStream-Implementierung nicht, dann musst du schon selber aufpassen,
wonach du in der while-Schleife abfragst und wie du ' return -1;' für Ende von 'SPECIAL_BYTE = -1' unterscheiden willst..
 
S

SlaterB

Gast
> Ich habe doch geschrieben was meine Frage ist

interessanterweise genau der gleiche Stil, statt die Aussage zu treffen wieder etwas recht allgemeines,
statt 'müsste nicht .. [warum?]' nun 'steht schon da [ja wo?]'

ich kann leider manchmal nicht alles verstehen und frage dann nach ;)

aus deinen zwei großen Codeblöcken + davor paar Zeilen zu byte[] war und ist mir absolut nicht klar,
was "Compiler selber erkennt ob ein Byte oder Integer Wert zurückgeben" bedeutet, welche Auswirkungen das haben könnte
 

Oben