·ByteArrayInputStream和ByteArrayOutputStream类:用于以IO流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能。当程序需要产生临时文件时,使用ByteArrayInputStream和ByteArrayOutputStream类程序可以直接访问内存,而不需要访问硬盘,运行效率会极大的提高。
内存虚拟文件(内存映像文件)其实是把内存中的一块数据存储缓冲区虚拟成一个文件,原来应该在硬盘读写的内容可以在内存中进行读写。
·构造函数:ByteArrayInputStream(Byte[] buf),以buf中的所有内容作为数据源,形成虚拟文件,其他程序可以以读取文件的方式读取该内存中的内容。
·构造函数:ByteArrayOutputStream(),创建一个32个字节的缓冲区,数据过多时会自动增长缓冲区的大小。
ByteArrayOutputStream(int size),创建size个字节的缓冲区,数据过多时会自动增长缓冲区的大小。
·编程实例:编写一个函数将一个输入流中的所有英文字母转变成大写字母,然后将结果写入到一个输出流对象,并用这个函数将一个字符串中的所有字符转换成大写字母。
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TestStream {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
byte[] buf = new String("abcdefghijklmnopqrstuvwxyz").getBytes();
ByteArrayInputStream in = new ByteArrayInputStream(buf);
ByteArrayOutputStream out = new ByteArrayOutputStream();
charChangeToUp(in,out);//输出流中现存有内容
System.out.println(out.toString());
try {
in.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static void charChangeToUp (InputStream in,OutputStream out){
int buf = 0;
try {
while((buf = in.read())!=-1){//未读取到文件的末尾则循环
out.write(Character.toUpperCase(buf));//将内容写入输出流
}
in.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
·StringReader和StringWriter类以字符IO流的方式处理字符串。
·重视IO程序代码的服用
--System.in连接到键盘,是InputStream类型的实例对象,System.out连接到显示器,是PrintStream类的实例对象。
--不管各种底层物理设备用什么样的方式来实现数据的终止点,InputStream的read方法总是返回-1来表示输入流的结束。
--在Windows下,按下Ctrl+Z组合键可以产生键盘输入流的结束标记,在Linux下,则是按下Ctrl+D组合键来产生键盘输入流的结束标记。
·借助上一页编写的函数,将键盘上输入的内容转变成大写字母后打印在屏幕上。
charChangeToUp(System.in,System.out)//从键盘读取内容,转换后输出到屏幕
·建议:要变成从键盘上连续读取一大段数据时,应尽量将读取数据的过程放在函数中完成,使用-1来作为键盘输入的结束点。在该函数中编写的程序代码不应直接使用System.in读取数据,而是用一个InputStream类型的形式参数对象来读取数据,然后将System.in作为实参传递给InputStream类型的形式参数来调用该函数。