No.19 字节数组流

2016-04-10  本文已影响72人  醒着的码者

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

上一篇下一篇

猜你喜欢

热点阅读