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"));
}
}
代码运行截图: