java程序员从笨鸟到菜鸟之(四十)内存操作流

ByteArrayOutputStream和ByteArrayInputStream

一、ByteArrayOutputStream  字节数组的输出流

内存操作流:顾名思义,读写都在内存中

特点:

(1)数据读写都在内存中,不需要关联源文件和目标文件

(2)适用于网络中小型数据的传输(图片、文件、小视频);因为缓冲数组的扩容总是有限度

(3)通过源码可以看出,有一个内置byte数组作为缓冲区(如果不指定的话),缓冲区会随写入的数据自动扩容

(4)此类中的方法在关闭此流后仍可被调用---(JVM去做的事情)两个流都适用,相关链接 点击打开链接

(5)是抽象字节流的子实现类

常用ByteArrayOutputStream来进行文件的读写,通过(1)"toString()"和(2)"toByteArray"结合"new String(bytes,0,len)"的方法

二、独特的方法

(1)void writeTo(OutputStream out) 

说明:将此 byte 数组输出流的全部内容写入到指定的输出流参数中;用处,保存内存操作流程中的数据到文本文件中

(2)void reset()

说明:将此 byte 数组输出流的 count 字段重置为零;理解为清空此操作流中的缓存

(3)byte[] toByteArray() ---相当于读数据

说明:获取此操作流中的缓存数据,以字节数组的形式;而要想获得字符串,还得结合String的构造方法

(4)String toString()    ----相当于读数据

说明:使用平台默认的字符集(也可以自己设置),通过解码字节将缓冲区内容转换为字符串

(5)int size()

说明:返回缓冲区的当前大小;作用:主要看数据写入的时候是否自动扩容

练习

package cutpointdownloaddemo;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class ByteArrayDemo {
    public static void main(String[] args) throws IOException {
        /*
        * 内存操作流:不去读写文件,在内存中的缓存区域 进行读写
        *a:操作字节数组
			ByteArrayOutputStream
			ByteArrayInputStream
			此流关闭无效,所以无需关闭
		b:操作字符数组
			CharArrayWrite
			CharArrayReader
		c:操作字符串
			StringWriter
			StringReader
        * */

        /*ByteArrayOutputStream 会在内存中开辟一个byte数组,作为他的缓冲区,那这个缓冲区会自动增长
        此类实现了一个输出流,其中的数据被写入一个 byte 数组。
        缓冲区会随着数据的不断写入而自动增长。
        可使用 toByteArray() 和 toString() 获取缓冲区中的数据。
        关闭 ByteArrayOutputStream 无效。
        此类中的方法在关闭此流后仍可被调用,
        而不会产生任何 IOException。*/

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        //把数据存到自己的缓冲区中去
        bos.write("白发戴花君莫笑,岁月从不败美人".getBytes());
        bos.write("接天莲叶无穷碧,映日荷花别样红".getBytes());
        //取出缓冲区中的数据
        byte[] bytes = bos.toByteArray();
        /*
        读取数据的方式1:把这个字节数组转成字符串
        String s = new String(bytes);
        System.out.println(s);
        */
        //读取数据的方式2:直接转化成字符串
        String string = bos.toString();
        System.out.println(string);
        //读取数据的方式3:ByteArrayInputStream
        read(bytes);
    }

    /**
     *
     * @param bytes:表示数据对应的字节数组缓冲区
     * @throws IOException
     */
    private static void read(byte[] bytes) throws IOException {
        //从缓冲区中读取数据
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        byte[] bytes1 = new byte[1024*8];
        bis.read(bytes1);//读取到的数据还得拿出来放到自己定义的缓冲区中
        String string = new String(bytes1);
        System.out.println(string.trim());//去掉两端的空格
    }
}

三、ByteArrayInputStream

特别说明:如果用此流读读取数据特别麻烦,首先要通过流对象构造方法创建缓存数组,然后读取数据到数组中,转化成字节数

组,最后再转化成字符串,没有ByteArrayInputStream流便捷

注意:它的"read"的两种重载形式是非阻塞的形式

补充:关于字节数组转换为字符串的其它方法--String.valueOf(bytes)

关于源码:点击打开链接点击打开链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值