Java提供了内存流机制,可以实现类似于内存虚拟文件的功能。
这样,我们既可以从内存中获取数据,也向内存中写入数据,也就是说,可以将内存作为数据的来源和目的地。内存操作流就是实现向内存中读取和写入数据的流类。
内存操作流一共也分为两组:
(1)字节内存操作流:ByteArrayOutputStream、ByteArrayInputStream;
(2)字符内存操作流:CharArrayWriter、CharArrayReader。
注意:
(1)不管是文件流还是内存流依然要满足向上转型的要求,都要使用到父类方法;
(2)关于两者的操作形式不同(数据的来源和目的地不同):
对于字节内存操作流而言,ByteArrayInputStream主要完成将数据写入到内存之中,而ByteArrayOutputStream的功能则是将内存中的数据输出。此时,内存作为数据的操作点,如下图所示:
ByteArrayInputStream是输入流(InputStream)的一种子类实现。
public class ByteArrayInputStream extends InputStream
它有两个构造方法,每个构造方法都需要一个字节byte数组来作为其数据源。
ByteArrayInputStream(byte[] buf)
ByteArrayInputStream(byte[] buf,int offse , int length)
类似地,ByteArrayOutputStream是输出流(OutputStream)的一种子类实现,其继承体系如下所示。
java.lang.Object
|-- java.io.OutputStream
|-- java.io.ByteArrayOutputStream
ByteArrayOutputStream类也有两个构造方法
ByteArrayOutputStream(); // 仅仅在内存当中创建一个字节数组输出流
BuyteArrayoutputStream(int size); // 在内存当中创建一个指定大小的字节数组输出流。
【示例】
package com.xy.io;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class ByteArrayDemo {
public static void main(String[] args) throws Exception {
String str = "abcdefghijklmnopqrstuvwxyz";
byte[] b = str.getBytes();
ByteArrayInputStream in = new ByteArrayInputStream(b);
ByteArrayOutputStream out = new ByteArrayOutputStream();
new ByteArrayDemo().transform(in, out);
byte[] result = out.toByteArray();
System.out.println(new String(result));
}
public void transform(InputStream in, OutputStream out) {
int c = 0;
try {
// 每次读取一个字符,并赋给c
while((c = in.read()) != -1) // read()在读到流的结尾处返回-1
{
int C = (int)Character.toUpperCase((char)c);
out.write(C);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}
【结果】
在本范例中,实施I/O操作的同时,并没有任何的文件产生,所以也可以把这种基于内存的操作理解为操作临时文件。