• 缓冲流


    缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流,按照数据类型分类:

    字节缓冲流: BufferedInputStream , BufferedOutputStream
    字符缓冲流: BufferedReader , BufferedWriter

    缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

    一、字节缓冲流

    构造方法

    public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
    public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。

    构造举例,代码如下:

    // 创建字节缓冲输入流
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
    // 创建字节缓冲输出流
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));

    效率测试

    查询API,缓冲流读写方法与基本的流是一致的,我们通过复制大文件(375MB),测试它的效率。

    1. 基本流,代码如下:

    public class BufferedDemo {
        public static void main(String[] args) throws FileNotFoundException {
            // 记录开始时间
           long start = System.currentTimeMillis();  
    // 创建流对象        
            try (
             FileInputStream fis new FileInputStream("jdk9.exe");    
             FileOutputStream fos new FileOutputStream("copy.exe")    
            ){
             // 读写数据    
                int b;
                while ((b = fis.read()) != ‐1) {
                    fos.write(b);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    // 记录结束时间        
            long end = System.currentTimeMillis();
            System.out.println("普通流复制时间:"+(end ‐ start)+" 毫秒");
        }
    }

    十几分钟过去了...

    2. 缓冲流,代码如下:

    public class BufferedDemo {
        public static void main(String[] args) throws FileNotFoundException {
            // 记录开始时间
           long start = System.currentTimeMillis();  
            // 创建流对象        
            try (
                 BufferedInputStream bis new BufferedInputStream(new FileInputStream("jdk9.exe"));    
                 BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream("copy.exe"));    
            ){
               // 读写数据
                int b;
                while ((b = bis.read()) != ‐1) {
                    bos.write(b);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 记录结束时间        
            long end = System.currentTimeMillis();
            System.out.println("缓冲流复制时间:"+(end ‐ start)+" 毫秒");
        }
    }

    缓冲流复制时间:8016 毫秒

    如何更快呢?缓冲流+字节数组

    使用数组的方式,代码如下:

    public class BufferedDemo {
        public static void main(String[] args) throws FileNotFoundException {
           // 记录开始时间  
            long start = System.currentTimeMillis();
    // 创建流对象        
            try (
    BufferedInputStream bis new BufferedInputStream(new FileInputStream("jdk9.exe"));            
     BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream("copy.exe"));        
            ){
               // 读写数据  
                int len;
                byte[] bytes = new byte[8*1024];
                while ((len = bis.read(bytes)) != ‐1) {
                    bos.write(bytes, 0 , len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    // 记录结束时间        
            long end = System.currentTimeMillis();
            System.out.println("缓冲流使用数组复制时间:"+(end ‐ start)+" 毫秒");
        }
    }

    缓冲流使用数组复制时间:666 毫秒

    二、字符缓冲流

    构造方法

    public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
    public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。

    构造举例,代码如下:

    // 创建字符缓冲输入流
    BufferedReader br = new BufferedReader(new FileReader("br.txt"));
    // 创建字符缓冲输出流
    BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));

    特有方法

    字符缓冲流的基本方法与普通字符流调用方式一致,不再阐述,我们来看它们具备的特有方法。

    BufferedReader: public String readLine() : 读一行文字。
    BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。

    readLine 方法演示,代码如下:

    public class BufferedReaderDemo {
        public static void main(String[] args) throws IOException {
            // 创建流对象  
            BufferedReader br = new BufferedReader(new FileReader("in.txt"));
    // 定义字符串,保存读取的一行文字        
            String line  = null;
           // 循环读取,读取到最后返回null  
            while ((line = br.readLine())!=null) {
                System.out.print(line);
                System.out.println("‐‐‐‐‐‐");
            }
    // 释放资源        
            br.close();
        }
    }

    newLine 方法演示,代码如下:

    public class BufferedWriterDemo throws IOException {
        public static void main(String[] args) throws IOException  {
           // 创建流对象  
    BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));        
           // 写出数据  
            bw.write("黑马");
           // 写出换行  
            bw.newLine();
            bw.write("程序");
            bw.newLine();
            bw.write("");
            bw.newLine();
    // 释放资源        
            bw.close();
        }
    }

    输出效果:

    黑马
    程序
    员
  • 相关阅读:
    《棉花帝国:一部资本主义全球史》笔记
    关于”空杯之心“的重新思考
    《光荣与梦想:19321972年美国叙事史》笔记
    《哥伦布大交换:1492年以后的生物影响和文化冲击》笔记
    《增长、短缺与效率》笔记
    《逃不开的经济周期:历史、理论与投资现实》笔记
    《经济学》笔记
    《就业、利息和货币通论》笔记
    PostgreSQL与MySQL比较
    让svn自动更新代码注释中的版本号
  • 原文地址:https://www.cnblogs.com/zwh0910/p/15403856.html
Copyright © 2020-2023  润新知