Inputstreamvergleicher mit Puffergröße und korrekter Beurteilung

flauschig

Mitglied
Hallo alle zusammen,

ich habe folgende Aufgabe:
Realisieren Sie einen boolean sindGleich(InputStream, InputStream) , der angibt, ob zwei Eingabeströme die gleiche Folge von bytes haben.

Ich habe diese Aufgabe derzeit so gelöst:
Java:
public class InputStreamVergleicher {

    public static boolean sindGleich(InputStream is1, InputStream is2) throws IOException {

    boolean sindGleich = true;
    int bytes1 = is1.read();
    int bytes2 = is2.read();

    while((bytes1 > 0 && bytes2 > 0)) {
        sindGleich = bytes1 == bytes2;
        bytes1 = is1.read();
        bytes2 = is2.read();
    }
    return sindGleich;
}

public static void main(String[] args) throws IOException {
     byte[] byteFolge = new byte[]{'a', 'b', 'c', 'd', 'a'};
     byte[] byteFolge2 = new byte[]{'a', 'b', 'c', 'd', 'a'};
     InputStream is1 = new ByteArrayInputStream(byteFolge);
     InputStream is2 = new ByteArrayInputStream(byteFolge2);
     System.out.println(InputStreamVergleicher.sindGleich(is1, is2));
     // Ausgabe: True
    }
}
Allerdings ist diese Lösung laut meinem Lehrer ineffizient, da ohne Puffer gearbeitet wird und die Methode nicht zuverlässig false bei ungleich langen Streams liefert.

Ich denke, man muss jetzt erst mal am Anfang vor der Methode eine Puffergröße erstellen:
Java:
private static final int PUFFERGROESSE = 1024;
und dann entsprechend noch am Anfang in die Methode einbinden:
Java:
byte[] puffer1 = new byte[PUFFERGROESSE];
byte[] puffer2 = new byte[PUFFERGROESSE];

Allerdings weis ich jetzt nicht wie weiter und wie man das Problem mit false bei ungleich langen Streams lösen kann.
Ich komme halt nicht drauf und mit einer Lösung lässt sich der Ablauf meist verstehen.
Hoffe das mir jemand bei der Lösung meines Problems helfen kann, danke.

Grüße
 

httpdigest

Top Contributor
Du könntest entweder einfach einen BufferedInputStream davorschalten, und den dann mit read() abfragen, oder aber du nutzt InputStream.read(byte[]). Lese dir das JavaDoc von der Methode genau durch, was sie macht und insbesondere, was der Rückgabewert genau bedeutet.
Aber du hast sonst auch noch einige Fehler im Code, da hat dein Lehrer schon Recht.
Spiel das Ganze mal mit zwei InputStreams durch, die jeweils nur ein einzelnes Byte enthalten. In dem einen 0 und in dem anderen 1. Deine Methode würde zurückliefern, dass beide gleich sind.
Schreib dir einfach Tests für alle möglichen Fälle. Ungleiche Länge, ungleiche Bytes, ...
 
X

Xyz1

Gast
1 kb ist zu klein, besser sind 6 kb (zB).
Weiterhin sind deutsche Variablennamen ganz übel.

Java:
    int j1, j2;
    while ((j1 = i1.read()) != -1 | (j2 = i2.read()) != -1) {
        if (j1 != j2) {
        return false;
        }
    }

    return true;


Schon verstanden - oder noch klärungsbedarf?
 

Ähnliche Java Themen

Neue Themen


Oben