zoukankan      html  css  js  c++  java
  • Java中常见的IO流及其使用

    BufferedInputStream & BufferedOutputStream

    如上面所介绍的那样,在BufferedInputStream的构造函数中需要传入一个InputStream, BufferedInputStream内部有一个字节数组缓冲区,每次执行read操作的时候就从这buf中读取数据,从buf中读取数据没有多大的开销。如果buf中已经没有了要读取的数据,那么就去执行其内部绑定的InputStream的read方法,而且是一次性读取很大一块数据,以便填充满buf缓冲区。缓冲区buf的默认大小是8192字节,也就是8K,在构造函数中我们也可以自己传入一个size指定缓冲区的大小。由于我们在执行BufferedInputStream的read操作的时候,很多时候都是从缓冲区中读取的数据,这样就大大减少了实际执行其指定的InputStream的read操作的次数,也就提高了读取的效率。与BufferedInputStream 相对的是BufferedOutputStream。在BufferedOutputStream的构造函数中我们需要传入一个OutputStream,这样就将BufferedOutputStream与该OutputStream绑定在了一起。BufferedOutputStream内部有一个字节缓冲区buf,在执行write操作时,将要写入的数据先一起缓存在一起,将其存入字节缓冲区buf中,buf是有限定大小的,默认的大小是8192字节,即8KB,当然也可以在构造函数中传入size指定buf的大小。该buf只要被指定了大小之后就不会自动扩容,所以其是有限定大小的,既然有限定大小,就会有被填充完的时刻,当buf被填充完毕的时候会调用BufferedOutputStream的flushBuffer方法,该方法会通过调用其绑定的OutputStream的write方法将buf中的数据进行实际的写入操作并将buf的指向归零(可以看做是将buf中的数据清空)。如果想让缓存区buf中的数据理解真的被写入OutputStream中,可以调用flush方法,flush方法内部会调用flushBuffer方法。由于buf的存在,会大大减少实际执行OutputStream的write操作的次数,优化了写的效率。 
    以下是BufferedInputStream 和 BufferedOutputStream的示例代码片段:

    private static void testBufferedInputOutputStream(){
            try{
                String inputFileName = "D:\iWork\file1.txt";
                String outputFileName = "D:\iWork\file2.txt";
                FileInputStream fis = new FileInputStream(inputFileName);
                BufferedInputStream bis = new BufferedInputStream(fis, 1024 * 10);
                FileOutputStream fos = new FileOutputStream(outputFileName);
                BufferedOutputStream bos = new BufferedOutputStream(fos, 1024 * 10);
                byte[] buf = new byte[1024];
                int length = 0;
                while ((length = bis.read(buf)) > 0){
                    bos.write(buf, 0, length);
                }
                bis.close();
                bos.close();
            }catch (FileNotFoundException e){
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    • 上面的代码将从file1.txt读取文件输入流,然后将读到的数据写入到file2.txt中,即实现了将file1.txt拷贝到file2.txt中。其实不通过BufferedInputStream 和 BufferedOutputStream也可以完成这样的工作,使用这个两个类的好处是,可以对file1.txt的读取以及file2.txt的写入提高效率,从而提升文件拷贝的效率。
  • 相关阅读:
    Android开发之百度地图的简单使用
    Android给ListView添加一个入场动画
    【安卓9】Cursor类、 查询
    【安卓9】SQLiteOpenHelper 类、增删改操作
    【安卓9】SQLiteDatabase类、ContentValues 类
    【安卓9】SQLite数据库
    【安卓8】SD卡操作
    【安卓8】文件的读写
    【安卓8】文件操作
    【安卓7】XML文件解析——PULL解析
  • 原文地址:https://www.cnblogs.com/mjblogs/p/5216305.html
Copyright © 2011-2022 走看看