JDK

java.io.ByteArrayInputStreamクラス

ByteArrayInputStreamはInputStreamからバイト配列としてデータを読み込むためのクラスである。byte型の配列としてbufというインスタンス変数が,次の読込位置を示すint型のインスタンス変数posが定義されている。

コンストラクタは,以下のようなものが定義されている。一つ目のものは与えられたバイト配列をすべて読み込む。2つ目のコンストラクタは与えられたバイト配列のうち,指定されたオフセットから指定された長さだけを読み込む。

  • ByteArrayInputStream(byte buf[])
  • ByteArrayInputStream(byte buf[], int offset, int length)

int read()メソッドは次のバイトを読込み,int型で返す。実装は0xFFとの積を計算している。int read(byte b[], int off, int len)メソッドでは引数で与えられたbyte型配列b[]に読み込んだデータをSystem.arraycopy()メソッドを使ってコピーしている。

readAllBytes()メソッドはストリームからすべてのデータをbyte型配列へ読み込んで返す。readNBytes(byte[] b, int off, int len)メソッドは指定のオフセットから指定の長さだけbyte型配列に読み込む。skip(long n)メソッドは,指定した長さだけストリームをスキップする。available()メソッドは残りのバイト数を返す。メソッド名と戻り値の内容にややずれがある印象だ。close()メソッドは実装されているものの,空である。

/*
 * Copyright (c) 1994, 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package java.io;
import java.util.Arrays;
import java.util.Objects;
public class ByteArrayInputStream extends InputStream {
    protected byte buf[];
    protected int pos;
    protected int mark = 0;
    protected int count;
    public ByteArrayInputStream(byte buf[]) {
        this.buf = buf;
        this.pos = 0;
        this.count = buf.length;
    }
    public ByteArrayInputStream(byte buf[], int offset, int length) {
        this.buf = buf;
        this.pos = offset;
        this.count = Math.min(offset + length, buf.length);
        this.mark = offset;
    }
    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
    }
    public synchronized int read(byte b[], int off, int len) {
        Objects.checkFromIndexSize(off, len, b.length);
        if (pos >= count) {
            return -1;
        }
        int avail = count – pos;
        if (len > avail) {
            len = avail;
        }
        if (len <= 0) {
            return 0;
        }
        System.arraycopy(buf, pos, b, off, len);
        pos += len;
        return len;
    }
    public synchronized byte[] readAllBytes() {
        byte[] result = Arrays.copyOfRange(buf, pos, count);
        pos = count;
        return result;
    }
    public int readNBytes(byte[] b, int off, int len) {
        int n = read(b, off, len);
        return n == -1 ? 0 : n;
    }
    public synchronized long transferTo(OutputStream out) throws IOException {
        int len = count – pos;
        out.write(buf, pos, len);
        pos = count;
        return len;
    }
    public synchronized long skip(long n) {
        long k = count – pos;
        if (n < k) {
            k = n < 0 ? 0 : n;
        }
        pos += k;
        return k;
    }
    public synchronized int available() {
        return count – pos;
    }
    public boolean markSupported() {
        return true;
    }
    public void mark(int readAheadLimit) {
        mark = pos;
    }
    public synchronized void reset() {
        pos = mark;
    }
    public void close() throws IOException {
    }
}