66. 缓存字节流

我们清楚操作文件数据使用缓冲数组读取效率更高,sun公司给我们提供了一个缓冲字节流,可以让我们更高效率操作文件

缓冲输入字节流:
----------------------| InputStream 输入字节流的基类
----------------| FileInputStream  读取文件的输入字节流
----------------| BufferedInputStream  缓冲输入字节流   作用:提高读取文件的效率
注意:BufferedInputStream其实底层创建了一个8kb的字节数组,跟我们自定义创建一个字节数组实现原理一样的

构造方法:
BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size)  创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。




缓冲输出字节流:
----------------------| OutputStream 输出字节流的基类
----------------| FileOutputStream 写入文件的输入字节流
----------------| BufferedOutputStream 缓冲输出字节流 作用:提高我们写入数据的效率
注意:BufferedOutputStream底层也是创建了一个8kb的字节数组,当我们在使用write方法的时候,数据其实存在了字节数组中,并没有写入文件中
当我们关闭文件,或者使用flush方法,或则字节数组存满,才会把数据写入文件中

构造方法:
BufferedOutputStream(OutputStream out)  创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size)  创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。

成员函数:
flush()      刷新此缓冲的输出流(也就是把字节数组中的数据写入文件中)。



注意:缓冲字节流本身并不具备读写文件能力



最后讲解一下容易混淆的一些函数(能力有限,可能说的不够明确):
fileInputStream.read(buf)     返回每次读取数据的长度,没有则返会-1
fileInputStream.read()       返回的是每次读取的数据,没有则返会-1

bufferedInputStream.read()    当读取到数据返回的是底层字符数组的数据,当没有读取到数据,会返回-1
bufferedInputStream.read(buf)   返回的是缓存到缓存数组中的字节总数(这个是父类的方法)当没有读取到数据,会返回-1


需求:拷贝图片

public class Demo1 {
    public static void main(String[] args) {
        File inputfile = new File("D:\\新建文件夹\\1.jpg");
        File outputfile = new File("D:\\新建文件夹 (2)\\1.jpg");
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            FileInputStream fileInputStream = new FileInputStream(inputfile);
            FileOutputStream fileOutputStream = new FileOutputStream(outputfile);
            bufferedInputStream = new BufferedInputStream(fileInputStream);
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            int content = 0;
            while((content = bufferedInputStream.read())!=-1) {
                bufferedOutputStream.write(content);
            }
        }catch(IOException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                bufferedOutputStream.close();
            }catch(IOException e) {
                throw new RuntimeException(e);
            }finally {
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

 

posted @ 2018-05-20 19:57  江小白鞋  阅读(134)  评论(0编辑  收藏  举报