JAVA中ByteArrayInputStream和ByteArrayOutputStream详解

1.ByteArrayInputStream

ByteArrayInputStream中包含一个内部缓冲区,用来包含那些可能从流中读的字节数组。还有一个内部计数器来跟踪下一个将被读取的字节。ByteArrayInputStream只能用字节数组来进行构造。主要包括的方法有和InputStream类似,请点击这里,只是重写了抽象方法。
下面是一段测试代码:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;

public class ByteArrayTest {
    public static void main(String[] args) throws IOException{
        String str="吉林张斌";

        //Unicode的编码就是UTF-16,每个字符占两个字节,UTF-8每个字符占3个字节
        ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes("UTF-16"));


        int len=bais.available();                            //之所以多了两个字节,是因为String串在最后有一个不可见的'\0'字符
        System.out.println(len);

        byte[] testread =new byte[6];                     
        bais.read(testread);                                 //只读取6个字节

        ByteBuffer bb = ByteBuffer.allocate(testread.length);//定义一个ByteBuffer,长度为字节数组长度                          
        bb.put(testread);                                    //用testread初始化ByteBuffer
        bb.flip();                                           //游标归0

        Charset cs = Charset.forName ("UTF-16");             //定义编码
        CharBuffer cb = cs.decode(bb);                       //将ByteBuffer转换为CharBuffer
        char[] chs = cb.array();                             //读出CharBuffer中的字节


        for(int i=0;i<chs.length;i++)
            System.out.println(chs[i]);

        if(chs[chs.length-1] == '\0')
            System.out.println("最后一个字符表示空");         //表示最后一个字符是'\0'
        else
            System.out.println("最后一个字符非空");
    }
}

代码运行结果截图:
运行结果

2.ByteArrayOutputStream

ByteArrayOutputStream中也有一个内部缓冲区,当数据写入是缓冲区会自动增长,内部有一个计数器来记录缓冲区的字节数。主要的方法和OutputStream类似,请点击这里,主要多了一下几个方法:
int size()
返回该流内部缓冲区中字节个数

byte[] toByteArray()
新建一个字节数组,将流中的字节以该数组形式返回

String toString()
将缓冲区的内容以字符串的形式返回,调用的编码方式为工作平台默认的编码方式

String toString(String charsetName)
以charsetName的对应的编码方式将缓冲区的内容以字符串的形式返回

ByteArrayOutputStream例子代码如下:

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

public class ByteArrayTest {
    public static void main(String[] args) throws Exception{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        String str="zhangbin";
        ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes("UTF-16"));

        int ch=0;
        while((ch = bais.read()) != -1){                              //读到尾部返回-1
            baos.write(ch);                                           //一个字节一个字节再写入到baos中
        }

        System.out.println("UTF-8结果:" + baos.toString());                          //默认编码UTF-8
        System.out.println("UTF-16结果:" + baos.toString("UTF-16"));
    }
}

代码运行截图:
运行结果

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ByteArrayInputStreamByteArrayOutputStreamJava的两个字节类。ByteArrayOutputStream类在创建实例时会创建一个内部的byte数组缓冲区,可以向该缓冲区写入byte类型的数据。而ByteArrayInputStream类则包含一个内部的缓冲区,用于存储从读取的字节数据。这两个类可以方便地用于在内存读取和写入字节数据。 通过ByteArrayOutputStream类,我们可以将多个变量的数据收集到一起,然后一次性将数据发送出去。具体使用方法如下: 1. 创建一个ByteArrayOutputStream对象。 2. 创建一个DataOutputStream对象,将其与ByteArrayOutputStream对象关联。 3. 使用DataOutputStream对象的方法将数据写入ByteArrayOutputStream对象。 4. 调用ByteArrayOutputStream对象的toByteArray()方法,将数据转换为字节数组。 通过ByteArrayInputStream类,我们可以从字节数组读取数据。具体使用方法如下: 1. 创建一个ByteArrayInputStream对象,将其与字节数组关联。 2. 创建一个DataInputStream对象,将其与ByteArrayInputStream对象关联。 3. 使用DataInputStream对象的方法从ByteArrayInputStream对象读取数据。 这样,我们就可以方便地使用DataOutputStream和DataInputStream封装的方法来读取和写入字节数组的数据。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [ByteArrayOutputStreamByteArrayInputStream详解](https://blog.csdn.net/iteye_15544/article/details/82069753)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值