美文网首页
No.19 字节数组流

No.19 字节数组流

作者: 醒着的码者 | 来源:发表于2016-04-10 22:20 被阅读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

    相关文章

      网友评论

          本文标题:No.19 字节数组流

          本文链接:https://www.haomeiwen.com/subject/vkzulttx.html