IO_BufferedInputStream&BufferedOutputStream

BufferedInputStream和BufferedOutputStream这两个类分别是FilterInputStream和FilterOutputStream的子类,作为装饰器子类,使用它们可以防止每次读取/发送数据时进行实际的写操作,代表着使用缓冲区.
不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高.
BufferedOutputStream要调用flush()方法或close()方法,强行将缓冲区中的数据写出。否则可能无法写出数据。之后的BufferedReader和BufferedWriter与此类似。
BufferedInputStream 是缓冲输入流。它继承于FilterInputStream
BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供“缓冲功能”以及支持mark()标记和reset()重置方法
BufferedInputStream 本质上是通过一个内部缓冲区数组实现的

public class BufferedInputStreamJava {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        String strFile = "d:" + File.separator + "javatest" + File.separator + "IO_RandomAccessFileTest.txt";
        File f = new File(strFile);
        FileInputStream fis = new FileInputStream(f);
        BufferedInputStream bis = new BufferedInputStream(fis);
        byte[] b = new byte[1024];
        //注意:这里定义了result,用于返回读取到的字节个数
        //在使用读到的字节数组的时候,如果没有result组装成String类输出的时候会有乱码
        //这个时候组装的是缓存的byte数组,而这个数组最后的时候往往没有读满
        int result = 0;
        while((result = bis.read(b)) != -1) {
            System.out.println(new String(b, 0, result));
            //new String(b) 这里会正确输出读到的数据,但是后面有大量乱码符号
        }
        bis.close();
        fis.close();
    }
}
public class BUfferedOutputStream {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        String strFile = "d:" + File.separator + "javatest" + File.separator + "IO_RandomAccessFileTest.txt";
        File f = new File(strFile);
        //true代表续写到文件尾
        FileOutputStream fos = new FileOutputStream(f, true);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        // \r\n换行
        byte[] StrB1 = "写入数据1...\r\n".getBytes();
        bos.write(StrB1);
        bos.flush();
        byte[] StrB2 = "写入数据2...".getBytes();
        bos.write(StrB2);
        //bos.close()没有关闭或者flush()的话,数据只会到缓冲区,不会到文件中
        bos.close();
        fos.close();
    }

}

猜你喜欢

转载自www.cnblogs.com/changzuidaerguai/p/9277467.html