提示

Java IO ByteArrayInputStream 使用示例。@ermo

回到上一级

# ByteArrayInputStream 使用示例

ByteArrayInputStreamInputStream 的一个子类,用于将字节数组数据读入程序中。

常用的构造方法有:

public ByteArrayInputStream(byte buf[])

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

ByteArrayInputStream(byte buf[]) 用于创建一个字节数组输入流,从 buf[0] 开始读取,读取 buf.lenght 个字节长度。

ByteArrayInputStream(byte buf[], int offset, int length) 用于创建一个字节数组输入流,从 buf[offset] 开始读取数据,读取 length 个长度。

read() 方法常用的重载方法:

public synchronized int read()

public synchronized int read(byte b[], int off, int len)

read() 方法可以从流中读取单个字节,返回值为0~255,读取完毕后将返回-1。

read(byte b[], int off, int len) 方法可以将源数组中的数据拷贝到 b[] 中,同时从 b[off] 开始存入,存储 len 个长度。这里要注意,如果读取长度 len 大于 b[] 的长度,会抛出 IndexOutOfBoundsException 异常。

看一个简单的例子:

    /**
     * Read bytes from ByteArrayInputStream.
     */
    public static void read() {
        byte[] array = {1, 2, 3, 4, 5};
        try {
            System.out.print("Read bytes from input stream: ");
            ByteArrayInputStream in = new ByteArrayInputStream(array);
            int data;
            while ((data = in.read()) != -1) {
                System.out.print(data + ", ");
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * Main method.
     *
     * @param args args
     */
    public static void main(String[] args) {
        read();
    }

上例输出:

Read bytes from input stream: 1, 2, 3, 4, 5, 

如果是将源数组中的数据拷贝到目标数组,可以这样使用:

    /**
     * Copy data to dest array.
     */
    public static void readLen() {
        byte[] array = {1, 2, 3, 4, 5};
        byte[] dest = new byte[3];
        try {
            System.out.println("Read bytes from input stream");
            ByteArrayInputStream in = new ByteArrayInputStream(array);
            in.read(dest, 0, 3);
            in.close();

            System.out.println(Arrays.toString(dest));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * Main method.
     *
     * @param args args
     */
    public static void main(String[] args) {
       readLen();
    }

上例会输出以下内容:

[1, 2, 3]

available() 方法返回剩余可读取的字节长度。

    /**
     * Use available.
     */
    public static void available() {
        byte[] array = {4, 5, 6, 7, 8, 9};
        try {
            ByteArrayInputStream in = new ByteArrayInputStream(array);
            System.out.println("\nRead bytes begin, available: " + in.available());
            in.read();
            in.read();
            System.out.println("Read bytes end, available: " + in.available());
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * Main method.
     *
     * @param args args
     */
    public static void main(String[] args) {
        available();
    }

上例程序会输出:

Read bytes begin, available: 6
Read bytes end, available: 4

ByteArrayInputStream 还有一些其他方法:

方法 描述
public synchronized long skip(long n) 跳过当前输入流的 n 个字节
public void mark(int readAheadLimit) 标记已经读取的流的位置,用于重新从这个位置读取流,当需要重新读取时,调用 reset() 方法
public synchronized void reset() 调用 reset() 方法将从 mark() 标记的位置重新读取流
public boolean markSupported() 查询当前类是否支持使用 mark() 重新读取流

mark(int readAheadLimit) 中的参数 readAheadLimit 表示设置标记后,能够继续往后读取的最大字节数,避免占用过多内存。

ByteArrayInputStreamreadAheadLimit 这个参数无效。

上次更新: 1/3/2023, 9:20:13 PM