1. 概要

このチュートリアルでは、CountingOutputStreamクラスとその使用方法について説明します。

このクラスは、 ApacheCommonsGoogleGuavaなどの人気のあるライブラリにあります。 Guavaライブラリでの実装に焦点を当てます。

2. CountingOutputStream

2.1. Mavenの依存関係

CountingOutputStream は、GoogleのGuavaパッケージの一部です。

pom.xmlに依存関係を追加することから始めましょう。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

依存関係の最新バージョンはここで確認できます。

2.2. クラスの詳細

このクラスはjava.io.FilterOutputStreamを拡張し、 write()および close()メソッドをオーバーライドし、新しいメソッド getCount()[を提供します。 X158X]。

コンストラクターは、別のOutputStreamオブジェクトを入力パラメーターとして受け取ります。 データの書き込み中に、クラスはこのOutputStreamに書き込まれたバイト数をカウントします。

カウントを取得するには、 getCount()を呼び出すだけで、現在のバイト数を返すことができます。

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

3. 使用事例

CountingOutputStreamを実際のユースケースで使用してみましょう。 例として、コードをJUnitテストに入れて実行可能にします。

この例では、 OutputStream にデータを書き込み、MAXバイトの制限に達しているかどうかを確認します。

制限に達したら、例外をスローして実行を中断します。

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. 結論

この簡単な記事では、CountingOutputStreamクラスとその使用法について説明しました。 このクラスは、これまでに OutputStreamに書き込まれたバイト数を返す追加のメソッドgetCount()を提供します。

最後に、いつものように、ディスカッション中に使用されたコードは、GitHubにあります。