No.19 字节数组流
java.IO中提供了ByteArrayInputStream/ByteArrayOutputStream字节数组输入输出流。
其实质是在用,数组的思想来操作读写操作。
在进行IO操作的时候我们可以大概分为三个对象:
控制台:System.in/System.out
硬盘:FileStream(包括字节流和字符流输入输出)
内存:ArrayStream(包括字节流中的ByteArray,字符流中的CharArray)。
ByteArrayOutputStream的用法:
(1)ByteArrayOutputStream,从某一输入流中获取字节数据,调用write(int var)方法写入内部缓冲区。此方法由于没有操作底层数据所以不许要关闭流,即使被关闭也可以再次被调用。
(2)ByteArrayOutputStream有两个构造参数,空参数的构造参数提供一个默认的可变的缓冲区,另一构造参数OutputStream out = new ByteArrayOutputStream(int a)提供一个指定大小的缓冲区的初始值。
(3)public byte[] toByteArray()/public String toString()两个方法提供了将缓冲区内容输出的方法。
(4)public void writeTo(OutputStream os)提供了将缓冲去内的内容一次性写入一个输出流中的方法,这里可以是硬盘也可以是控制台。
(5)实例:
public class Test {
public static void main(String[] args) {
ByteArrayInputStream bis = null;
ByteArrayOutputStream bos = null;
bis = new ByteArrayInputStream("ABCDEFG".getBytes());
//这里不指定缓冲区大小。
bos = new ByteArrayOutputStream();//初始化长度为0
//这里指定缓冲区大小
//bos = new ByteArrayOutputStream(1);//初始化长度为1
int b = 0;
while((b = bis.read()) != -1){
bos.write(b);
}
//写入缓冲区后可以查看缓冲区大小,也可以查看缓冲区内容
System.out.println(bos.size());//7
byte[] be = bos.toByteArray();
for(byte bt : be){
System.out.print(bt + " ");//65 66 67 68 69 70 71
}
System.out.println();
System.out.println(bos.toString());//ABCDEFG
//将缓冲区内写入一个outputStream流中字节数组流中只有这个方法会报异常
try {
bos.writeTo(new FileOutputStream("d://text.txt"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ByteArrayInputStream的用法:
(1)ByteArrayInputStream对象接受一个字节数组作为参数。如果需要存放的数据很多可以提前声明一个指定大小的数组,如果不多可以直接同过相应的转化获取如:string类的getByte()方法。
(2)该字节数组的内容来源可以是一个文件的输入流中数据,通过read(buf)方法得到的字节数据,也可同过string类的getByte()方法直接的的到一个。
(3)字节数组输如流的的操作方法同其他输入流一样,通过循环判断read返回值来输出数组中的内容,每次从缓冲buf中获取一个字节数据。
(4)应用实例:
public class Test {
public static void main(String[] args) {
FileInputStream fis= null;
ByteArrayInputStream bis = null;
try {
fis = new FileInputStream("D://text.txt");
//确定缓冲区数组大小
byte[] buf = new byte[512];
bis = new ByteArrayInputStream(buf);
//将文件写入缓存区,调用fileInputSream的read(Byte[] b)方法
fis.read(buf);
//读取ByteArrayInputStream缓冲区数组中的内容
int i = 0;
while((i = bis.read()) != -1){
System.out.println((char)i);
}
//不用关闭bis流
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
总结
(1)从继承关系来看字节数组流直接继承自基类InputStream和OutputStream,他起到的作用看来起到了 装饰/提高效率的作用。
(2)这两个IO类,其实起到了从控制台,或者硬盘(文件)读取流到内存中的作用。
FileInputStream -> ByteArrayOutputStream ->FileOutputsStream
FileInputStream -> ByteArrayInputStream ->System.out