内存字节流
使用文件流,我们可以操作文件中的数据。使用内存流,我们可以操作内存中字节数组中的数据。
内存字节流,也称为字节数组流:
-
java.io.ByteArrayOutputStream
内存输出流,负责把数据写入到内存中的字节数组中
-
java.io.ByteArrayInputStream
内存输入流,负责从内存中的字节数组中读取数据.
接下来,我们先来学习内存输出流,再学习内存输入流!
1)内存输出流
ByteArrayOutputStream
源码分析:
package java.io;
public class ByteArrayOutputStream extends OutputStream {
//存储数据的数组
protected byte buf[];
//存入字节数组的元素(字节)个数
protected int count;
//无参构造器创建的字节数组输出流,数组大小为32个字节
public ByteArrayOutputStream() {
this(32);
}
//关键方法:获取内存输出流中存储的数据,返回字节数组
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
//省略...
}
案例展示:
小数组方式读取src/dir/a.txt
文件中所有内容,写入到字节数组输出流中,然后从字节输出流中获取所有数据,最后转换成String字符串输出。
package com.briup.chap11.test;
public class Test024_ByteArrayOutput {
public static void main(String[] args) throws IOException {
//1.关联流对象和文件
// 创建内存输出流对象[new byte[32]]
InputStream is = new FileInputStream("src/dir/a.txt");
ByteArrayOutputStream os = new ByteArrayOutputStream();
//2.读取文件内容 然后写入到 内存输出流中
byte[] arr = new byte[8];
int len;
while((len = is.read(arr)) != -1) {
//写入 内存输出流
os.write(arr, 0, len);
}
System.out.println("拷贝完成!");
//3.关键方法:获取内存输出流中的数据
byte[] byteArray = os.toByteArray();
//4.将byte[] --> String 并输出
System.out.println(new String(byteArray));
//5.注意:内存流不需要close()释放资源
}
}
运行结果:
注意:内存流使用完不需要close()去释放资源!
原因:内存流的底层数据源是内存中的字节数组,不需要进行资源释放或关闭操作。当使用完 ByteArrayXxxStream
后,可以选择不进行任何操作,它会自动被垃圾回收机制回收。
2)内存输入流
ByteArrayInputStream
类源码:
package java.io;
public
class ByteArrayInputStream extends InputStream {
protected byte buf[];
protected int pos;
protected int count;
//关键构造器
public ByteArrayInputStream(byte buf[]) {
this.buf = buf;
this.pos = 0;
this.count = buf.length;
}
//省略...
}
案例展示:
1.从键盘录入1行字符串,将其转换为byte[]数组
2.由byte[]数组
构建一个内存输入流对象
3.从内存输入流中用小数组方式读取数据,并写入到src\dir\b.txt
文件中
4.关闭流、释放资源
package com.briup.chap11.test;
public class Test024_ByteArrayInput {
public static void main(String[] args) throws Exception {
//1.实例化sc对象 并录入一行字符串
Scanner sc = new Scanner(System.in);
System.out.println("input line:");
String line = sc.nextLine();
//2.将字符串转换成字节数组
byte[] bytes = line.getBytes();
//由 字节数组 构建 内存输入流对象
InputStream is = new ByteArrayInputStream(bytes);
//创建文件输出流对象
OutputStream os = new FileOutputStream("src/dir/b.txt");
//3.小数组方式读取内存流数据
byte[] arr = new byte[5];
int len;
while((len = is.read(arr)) != -1) {
//4.写入b.txt文件中
os.write(arr, 0, len);
}
System.out.println("文件操作完成!");
//5.关闭流、释放资源
os.close();
// 注意:内存流不需要关闭
}
}
内存流总结:
- 如果要操作文件,则需要使用文件流
- 如果要操作内存中的数据,则可以选择内存流
内存字节流提供了一种在内存中进行数据读取和写入的便捷方式。内存流在实际开发中有专门的应用场景,我们使用不多,了解即可。
常见应用场景:
- 数据的临时存储:内存字节流可以将数据暂时存储在内存中的字节数组中,而不需要写入到磁盘或网络中。这在一些临时性的数据处理场景中非常有用,例如在内存中对数据进行加密、解密、压缩、解压缩等操作。
- 数据的转换:内存字节流可以用于将数据从一种格式转换为另一种格式。例如,可以将一个对象序列化为字节数组,然后再将字节数组反序列化为对象。这在一些需要将数据在内存中进行格式转换的场景中非常有用。
- 测试和调试:内存字节流可以用于测试和调试目的,例如模拟输入流或输出流的行为。通过将数据写入内存字节流,可以方便地检查数据的内容和格式,而无需依赖外部资源。
- 单元测试:内存字节流在单元测试中也非常有用。可以使用内存字节流模拟输入和输出流,以便在测试中验证代码的正确性和可靠性,而无需依赖外部文件或网络连接。
需要注意,由于内存字节流将数据存储在内存中的字节数组中,因此在处理大量数据时可能会占用较多的内存。在这种情况下,需要谨慎使用内存字节流,以避免内存溢出的问题。