JAVA ByteArrayInputStream 和 ByteArrayOutputStream 的用法教程

IO 流中有两个类, ByteArrayInputStream 和 ByteArrayOutputStream 的用法我经常忘记,但很多框架底层又都使用到它们,所以这里我准备将它们的用法总结成一篇博客加深影响,后面再用到,直接看博客学习。

上面这两分别是 InputStream 和 OutputStream 的继承类,并不是接口实现类,当然,这里多说一句,InputStream 也不是接口,而是一个抽象类。

ByteArrayInputStream 和 ByteArrayOutputStream 都是内存流,也就是说读写都在内存进行。

ByteArrayInputStream:读取 byte 数组,也就是将 byte 数组当做数据源读取。

ByteArrayOutputStream :写 byte 数组,要注意,它不是将 byte 数组写入到文件(不直接操作文件),而是将 byte 数组写入到内存中的 byte 数组,也就是内存流。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。

比如:

    /**
     * 将字节数组写入到内存
     */
    public void writeByteArray() throws IOException{
        String msg = "hello ";
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        //写入到内存,内存流
        byteArrayOutputStream.write(msg.getBytes());
    }

如果运行上面代码你会看不到任何变化,这是正常的。那将数据写入到内存中后,怎样取出来呢?

有两个办法,可以用 ByteArrayInputStream 读取,也可以使用 ByteArrayOutputStream 的方法 toByteArray() 。

它的作用是从内存流中获取 byte 数组。

    byte [] result = byteArrayOutputStream.toByteArray();
    System.out.println(Arrays.toString(result));

而 ByteArrayInputStream 的构造函数有点不一样,本身构造方法中就需要传递 byte 数组,这也是它读取的数据源,

    String msg = "hello ";
    ByteArrayInputStream bis = new ByteArrayInputStream(msg.getBytes());

它的读法和 InputStream 差不多,有两种,要么只单独读一个 byte,如果读到末尾返回 -1。

    bis.read();

还可以读取一个 byte 数组,它代表读取若干字节填充到 byte 数组中,返回的 int 是真实读取的字节数。

    @Test
    public void sdgasgdTest() throws IOException {
        String msg = "hello ";
        ByteArrayInputStream bis = new ByteArrayInputStream(msg.getBytes());
        byte[] buffer = new byte[1024];
        int len = -1;
        while((len = bis.read(buffer)) != -1){
            System.out.println(new String(buffer));
        }
    }

这就是它们的用法,还记得上面提到的吗?这两个类不直接操作文件的读写。都是 byte 数组和内存相互读写。那如果要将数据写入到文件呢?

    public void writeByteArray() throws IOException{
        String msg = "hello ";
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        //写入到内存,内存流
        byteArrayOutputStream.write(msg.getBytes());

        //创建字节输出流
        FileOutputStream fileOutputStream = new FileOutputStream("/Users/guozh/Pictures/test.txt");
        fileOutputStream.write(byteArrayOutputStream.toByteArray());
        //或者如下写法
        //byteArrayOutputStream.writeTo(fileOutputStream);
    }

那它们俩使用场景呢?常用来临时读写,因为操作内存速度快,所以会考虑把数据临时保存到内存中,项目中如果用到文件系统,一般会看到这两个类。

本文由老郭种树原创,转载请注明:https://guozh.net/java-bytearrayinputstream-bytearrayoutputstream/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注