java.io.InputStream の read(byte[], int, int) は -1 を区切りにデータを読み込む

これを抑えておくとテストを書くときに便利。


以下のようなクラスを用意しておくと、

  • -1, 0, 1, ... 255が配列(コンストラクタのdata)に含まれていたら、それは有意なデータの一部
  • -1, 0, 1, ... 255以外の値が配列に含まれていたら(擬似)IOException
  • -1 が配列の先頭以外で単独で現れたら、read(byte[], int, int) で読めるデータの区切り
  • -1 が配列の先頭、もしくは2個連続で現れたらストリームの終わり
  • data の値を全部返しきったらストリームの終わり

を表現することができる。dataの終わりまでみたらストリームの終わりにした方が自然なような気がするけれど、終わりまで読んでない状態でテストをしたいケースがあったので、あえて wait() してる。

class _InputStream extends InputStream {
    private byte[] data;
    private int count;

    public _InputStream(byte[] data) {
        this.data = data;
        count = 0;
    }
        
    @Override
    public int read() throws IOException {
        if (count == data.length) {
            try {
                synchronized (this) { wait(); }
            } catch (InterruptedException ie) {}
            return -1;
        }
        int value = data[count++];
        if (value <-1 || value > 255) {
            throw new IOException();
        }
        return value;
    }
        
    @Override
    public void close() {
        synchronized (this) {
            notify();
        }
    }
}