简介

ByteArrayInputStream 包含一个内部缓冲区,该缓冲区存储从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException

方法摘要

int available()  //返回可不发生阻塞地从此输入流读取的字节数。
void close()     // 关闭 ByteArrayInputStream 无效。
void mark(int readHeadLimit)  //设置流中的当前标记位置。
boolean markSupported()   //测试此 InputStream 是否支持 mark/reset。
int read()        //从此输入流中读取下一个数据字节。
int read(byte[]b,int off,int len)  //将最多 len 个数据字节从此输入流读入字节数组。
void reset()     //将缓冲区的位置重置为标记位置。
long skip(int n)  //从此输入流中跳过 n 个输入字节。

 例子

private static final int LEN = 5;
    
    // 对应英文字母“abcddefghijklmnopqrsttuvwxyz”
    private static final byte[] ArrayLetters = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 
                                                0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 
                                                0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 
                                                0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 
                                                0x79, 0x7A};
    
    public static void main(String[] args)
    {
        ByteArrayInputStream bais = new ByteArrayInputStream(ArrayLetters);
        /**
         * 遍历数组中的字节流
         */
        for (int i = 0; i < LEN; i++)
        {
            /**
             * 是否可以读取5个字节
             */
            if (bais.available() > 0)
            {
                System.out.println("0x" + Integer.toHexString(bais.read()));
            }
        }
        
        /**
         * 不支持标记则直接退出
         */
        if (!bais.markSupported())
        {
            System.out.println("mark no supported");
            return;
        }
        
        /**
         * 标记“字节流中下一个被读取的位置”。
         * 但是在ByteArrayInputStream类的mark(0)函数中的“参数0”是没有实际意义的。 
         */
        bais.mark(0);
        byte[] buf = new byte[LEN];
        bais.read(buf, 0, LEN);
        System.out.println(new String(buf));
        
        /**
         * 跳过5个字符
         */
        bais.skip(5);
        bais.read(buf, 0, LEN);
        System.out.println(new String(buf));
        
        /**
         *  重置“字节流”,及mark所标记的位置。
         */
        bais.reset();
        bais.read(buf, 0, LEN);
        System.out.println(new String(buf));
        /**
         * 深度解析mark与reset之间的关系、
         * 
         * mark()只是一个标记位,也就是标记字符流中下一个被读取的位置。
         * reset()是是将字符流中下一个被读取的位置重置到mark()所标记的位置
         * 使用的时候mark()和reset()是配套使用的
         * 
         */
    }

 

 

posted on 2014-04-04 10:55  苏荷酒吧  阅读(310)  评论(0)    收藏  举报