在之前使用的全部都是文件操作流,文件操作流的特点,程序利用InputStream读取文件内容,而后程序利用OutputStream向文件输出内容,所有的操作都是以文件为为终端的。 假设说现在需要实现IO操作,可是又不希望产生文件(临时文件)则就可以以内存为终端进行处理,这个时候的流程: 在Java里面提供有两类的内存操作流: 字节内存操作流:ByteArrayOutputStream、ByteArrayInputStream; 字符内存操作流:CharArrayWriter、CharArrayReader; 下面以ByteArrayOutputStream和ByteArrayInputStream类为主进行内存的使用分析,首先来分析各自的构造方法: ByteArrayInputStream构造:public ByteArrayInputStream(byte[] buf); ByteArrayOutputStream构造:public ByteArrayOutputStream();
在ByteArrayOutputStream类里面有一个重要的方法,这个方法可以获取全部保存在内存流中的数据信息,该方法为: 获取数据:public byte[] toByteArray(); 使用字符串的形式来获取:public String toString();
范例:利用内存流实现一个小写字母转大写字母的操作
package cn.mldn.demo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; public class JavaAPIDemo { public static void main(String[] args) throws Exception { String str = "www.mldn.cn"; // 小写字母 InputStream input = new ByteArrayInputStream(str.getBytes()); // 将数据保存在内存流 OutputStream output = new ByteArrayOutputStream(); // 读取内存中的数据 int data = 0 ; while ((data = input.read()) != -1) { // 每次读取一个字节 output.write(Character.toUpperCase(data)); // 保存数据 } System.out.println(output); input.close(); output.close(); } }如果现在不希望只是以字符串的形式返回,因为可能存放的是其它二进制的数据,那么此时就可以利用ByteArrayOutputStream子类的扩展功能获取全部字节数据。
package cn.mldn.demo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; public class JavaAPIDemo { public static void main(String[] args) throws Exception { String str = "www.mldn.cn"; // 小写字母 InputStream input = new ByteArrayInputStream(str.getBytes()); // 将数据保存在内存流 ByteArrayOutputStream output = new ByteArrayOutputStream(); // 读取内存中的数据 int data = 0 ; while ((data = input.read()) != -1) { // 每次读取一个字节 output.write(Character.toUpperCase(data)); // 保存数据 } byte result [] = output.toByteArray(); // 获取全部数据 System.out.println(new String(result)); // 自己处理字节数据 input.close(); output.close(); } }在最初的时候可以利用ByteArrayOutputStream实现大规模文本文件的读取。