玉骨西风,恨最恨、闲却新凉时节。

——周密《玉京秋》

## IO流之内存操作流

1. 内存操作流概述

如果我们在操作流的时候,不想让流输出到文件中,但是又需要对流进行操作,就可以使用内存流来实现输入与输出。针对于内存流,java.io 包里面提供了两组操作:

  1. 字节内存流:ByteArrayInputStream、ByteArrayOutputStream
  2. 字符内存流:CharArrayReader、CharArrayWriter

两者在操作上面就类似于 FileInputStream、FileOutputStream 与 FileReader 与 FileWriter

2. 与基础流OutputStream/InputStream的区别

  1. 以文件操作为例:
    • 输出(OutputStream):程序 → OutputStream → 文件;
    • 输入(InputStream):程序 ← InputStream ← 文件;
  2. 以内存操作为例:
    • 输出(ByteArrayInputStream):程序 → ByteArrayInputStream→ 内存;
    • 输入(ByteArrayOutputStream):程序 ← ByteArrayOutputStream← 内存;
  3. 需要注意的 是程序是运行在内存上的。

3. 测试

str字符串通过ByteArrayInputStream读取到内存中,然后通过ByteArrayOutputStream将内存中的数据输出(也就是在程序中)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* @Date 2020/6/12 13:18
* @Version 10.21
* @Author DuanChaojie
*/
public class TestByteArrayStream {
public static void main(String[] args) throws IOException {

// 要被转换的字符串(相当于程序)
String str = "hello world";

// 本次通过内存流操作实现转换,先将数据保存到内存流当中,然后从中取出每一个数据,
// 将所有要读取的数据设置到内存输入流之中,利用向上转型
// ByteArrayInputStream
InputStream in = new ByteArrayInputStream(str.getBytes());

// 为了能够将所有内存流数据取出,可以使用ByteArrayOutputStream
OutputStream out = new ByteArrayOutputStream();

// 每次读取一个字节
int len = 0;

// 此次循环之后,所有数据都保存在内存输出流对象之中。
while ((len = in.read()) != -1) {
// 字节输出流
out.write(Character.toUpperCase(len));
}
// HELLO WORLD
System.out.println(out);

in.close();
out.close();
}
}