问题背景
在实际应用中,我们会碰的一个功能的输出的字节流,是另一个功能输入字节流的情况。一般情况下,我们可以使用ByteArrayOutputStream和ByteArrayInputStream实现相应的功能。
来看下面的测试代码:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
public class ByteArrayTest {
public static void main(String[] argv) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
PrintWriter ps = new PrintWriter(output);
for (int i = 0; i < 1000; i++) {
ps.printf("This is line %d\n", i);
}
ps.close();
ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = input.read(buffer)) > 0) {
System.out.write(buffer, 0, len);
}
input.close();
}
}
在上面的代码中,我们通过ByteArrayOutputStream对象把输出转换为字节数组,在通过ByteArrayInputStream对象把字节数组转换为输入流。
当需要转换的字节流比较小时,上面的方法是一个简便的且行之有效的方法,然而当字符流比较大时,上面的代码会消耗大量的内存,甚至可能出现内存溢出的情况。
解决方法
为解决上一节提出的问题,本文实现一个字节流转换类,可以直接使用完成以上功能。基本原理是开辟一个缓冲区,通过对缓冲区并发的交互的读写操作实现内存复用和字节流的转换。
转换类代码如下:
import java.io.IO