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/