Verwendung von Guava CountingOutputStream

Verwenden von Guava CountingOutputStream

 

1. Überblick

In diesem Tutorial werden wir uns die KlasseCountingOutputStreamund ihre Verwendung ansehen.

Die Klasse befindet sich in gängigen Bibliotheken wieApache Commons oderGoogle Guava. Wir werden uns auf die Implementierung in der Guava-Bibliothek konzentrieren.

2. CountingOutputStream

2.1. Maven-Abhängigkeit

CountingOutputStream ist Teil des Guava-Pakets von Google.

Beginnen wir mit dem Hinzufügen der Abhängigkeit zupom.xml:


    com.google.guava
    guava
    24.1-jre

Die neueste Version der Abhängigkeit kann inhere überprüft werden.

2.2. Klassendetails

Die Klasse erweitertjava.io.FilterOutputStream, überschreibt die Methodenwrite() undclose() und stellt die neue MethodegetCount() bereit.

Der Konstruktor verwendet ein weiteresOutputStream-Objekt als Eingabeparameter. While writing data, the class then counts the number of bytes written into this OutputStream.

Um die Anzahl zu erhalten, können wir einfachgetCount() aufrufen, um die aktuelle Anzahl von Bytes zurückzugeben:

/** Returns the number of bytes written. */
public long getCount() {
    return count;
}

3. Anwendungsfall

Verwenden wirCountingOutputStream in einem praktischen Anwendungsfall. Zum Beispiel werden wir den Code einem JUnit-Test unterziehen, um ihn ausführbar zu machen.

In unserem Fall werden wir Daten inOutputStream schreiben und prüfen, ob wir eine Grenze vonMAX Bytes erreicht haben.

Sobald wir das Limit erreicht haben, möchten wir die Ausführung durch Auslösen einer Ausnahme abbrechen:

public class GuavaCountingOutputStreamUnitTest {
    static int MAX = 5;

    @Test(expected = RuntimeException.class)
    public void givenData_whenCountReachesLimit_thenThrowException()
      throws Exception {

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        CountingOutputStream cos = new CountingOutputStream(out);

        byte[] data = new byte[1024];
        ByteArrayInputStream in = new ByteArrayInputStream(data);

        int b;
        while ((b = in.read()) != -1) {
            cos.write(b);
            if (cos.getCount() >= MAX) {
                throw new RuntimeException("Write limit reached");
            }
        }
    }
}

4. Fazit

In diesem kurzen Artikel haben wir uns die KlasseCountingOutputStreamund ihre Verwendung angesehen. Die Klasse stellt die zusätzliche MethodegetCount() bereit, die die Anzahl der bisher inOutputStream geschriebenen Bytes zurückgibt.

Schließlich kann wie immer der während der Diskussion verwendete Codeover on GitHub gefunden werden.