• 缓冲流详细解释


    缓冲流:

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

     字节流顶层父类:InputStream(字节输入流) 和 OutputStream(字节输出流)

     字符流顶层父类:Reader(字符输入流)  和  Writer(字符输出流)

    • 字节缓冲流BufferedInputStreamBufferedOutputStream

    • 字符缓冲流BufferedReaderBufferedWriter

    • 缓冲流的基本原理,是创建流对象时候,会创建一个内置的默认大小的缓冲区数组,通过缓冲区书写.

    构造方法:

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

     构造举例,代码如下图片加载.

     1 package com.heima.zifu;
     2 
     3 import java.io.BufferedInputStream;
     4 import java.io.BufferedOutputStream;
     5 import java.io.FileInputStream;
     6 import java.io.FileOutputStream;
     7 
     8 //打印图片
     9 public class Demo01 {
    10     public static void main(String[] args) throws Exception{
    11         //创建缓冲字节输入流对象指定数据源
    12         BufferedInputStream shuru=new BufferedInputStream(new FileInputStream("C:\Users\ASUS\Desktop\截图\123.jpg"));
    13         //创建缓冲字节输出流对象指定数据源
    14         BufferedOutputStream shucu=new BufferedOutputStream(new FileOutputStream("123.jpg"));
    15         //读写数据
    16         //定义长度
    17         byte [] bytes=new byte[1024];
    18         //定义长度
    19         int len;
    20         while ((len=shuru.read(bytes))!=-1){
    21             //导出数据
    22             shucu.write(bytes,0,len);
    23         }
    24         //关闭资源
    25         shucu.close();
    26         shuru.close();
    27 
    28     }
    29 }

     普通方法测试:

     基本代码如下:

     1 package com.heima.zifu;
     2 import java.io.FileInputStream;
     3 import java.io.FileOutputStream;
     4 //效率测试
     5 public class Demo02 {
     6     public static void main(String[] args) {
     7         //记录查询时间
     8         long shijian = System.currentTimeMillis();
     9         try {
    10             //创建输入流对象
    11             FileInputStream fileInputStream = new FileInputStream("C:\Users\ASUS\Desktop\截图\222.jpg");
    12             //创建输出流对象
    13             FileOutputStream fileOutputStream = new FileOutputStream("1215.jpg");
    14             {
    15                 //读写数据
    16                 int b;
    17                 while ((b=fileInputStream.read())!=-1){//try异常
    18                          fileOutputStream.write(b);
    19                 }
    20             }
    21 
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24         }
    25         //记录异常
    26        long end= System.currentTimeMillis();
    27         System.out.println("普通流复制时间:"+(end-shijian)+"毫秒");
    28     }
    29 }
    30 //输出结果:普通流复制时间:1701毫秒

     高效率测试:

     基本代码如下:

     1 package com.heima.zifu;
     2 
     3 import java.io.*;
     4 
     5 //高效流输出时间
     6 public class Demo03 {
     7     public static void main(String[] args) {
     8         //记录开始时间
     9         long kaishi = System.currentTimeMillis();
    10         try {
    11             //创建高效流字节输入
    12             BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("C:\Users\ASUS\Desktop\截图\222.jpg"));
    13             //创建高效流字节输出
    14             BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("22222.jpg"));
    15             {
    16                 //读写数据
    17                 int a;//定义变量
    18                 while ((a=bufferedInputStream.read())!=-1){
    19                     bufferedOutputStream.write(a);
    20                 }
    21             }
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24         }
    25         //记录结束时间
    26         long jieshu=System.currentTimeMillis();
    27         //输出
    28         System.out.println("高效流花费时间:"+(jieshu-kaishi)+"毫秒");
    29 
    30     }
    31 }
    32 //输出结果:高效流花费时间:37毫秒

     

     总结:

      • InputStreamReader和OutputStreamWriter
        在构造这两个类对应的流时,它们会自动进行转换,将平台缺省的编码集编码的字节转换为Unicode字符。对英语环境,其缺省的编码集一般为ISO8859-1。
      • BufferedReader和BufferedWriter
        这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理。

     注意:普通字节流在传字节数组的时候比高效字节流快.

     字符缓冲流特有的方法:

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

     readLine()方法读取一行代码:

     代码演示:

     1 package com.heima.zifu;
     2 import java.io.BufferedReader;
     3 import java.io.FileReader;
     4 //readLine方法
     5 public class Demo04 {
     6     public static void main(String[] args) throws Exception{
     7         //创建高效字符输入流对象
     8         BufferedReader bufferedReader = new BufferedReader(new FileReader("c.txt"));
     9         //定义字符串
    10         String line=null;
    11         //循环读取
    12         while ((line=bufferedReader.readLine())!=null){
    13             for(int i=0;i<line.length();i++){
    14                 System.out.println(line+" "+i);
    15                 System.out.println("-----------");
    16             }
    17         }
    18         //释放资源
    19         bufferedReader.close();
    20     }
    21 }

     对BufferedReader类,该类的readLine()方法能一次从流中读入一行,但对于BufferedWriter类,就没有一次写一行的方法,所以若要向流中一次写一行,

     可用PrintWriter类将原来的流改造成新的打印流,PrintWriter类有一个方法println(),能一次输出一行。

     如:PrintWriter类中的println方法.

    PrintWriter out = new PrintWriter(new BufferedWriter(
          new FileWriter("D:javacode	est.txt")));
    out.println("Hello World!");
    out.close();
    

    newLine方法演示写一行分割符:

    代码演示:

     1 package com.heima.zifu;
     2 
     3 import java.io.BufferedWriter;
     4 import java.io.FileWriter;
     5 import java.io.IOException;
     6 
     7 public class Demo05 {
     8     public static void main(String[] args) throws Exception {
     9         //创建高效字符输出流对象
    10         BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("a.txt"));
    11         //写出数据
    12         bufferedWriter.write("世人笑我太疯癫,");
    13         //写出换行
    14         //BufferedWriter:public void newLine():
    15         // 写一行行分隔符,由系统属性定义符号。
    16         bufferedWriter.newLine();
    17         bufferedWriter.write("我笑世人看不穿。");
    18         //释放资源
    19         bufferedWriter.close();
    20     }
    21 }
    22 //输入结果
    23 /*
    24 世人笑我太疯癫,
    25 我笑世人看不穿。
    26  */

    练习:给文本排序
    分析:

    1. 逐行读取文本信息。

    2. 解析文本信息到集合中。

    3. 遍历集合,按顺序,写出文本信息。

     1 package com.heima.zifu;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.BufferedWriter;
     5 import java.io.FileReader;
     6 import java.io.FileWriter;
     7 import java.util.HashMap;
     8 
     9 //练习文本排序
    10 public class Demo06 {
    11     public static void main(String[] args) throws Exception {
    12         /*
    13         案例分析
    14        1. 逐行读取文本信息。
    15        2. 解析文本信息到集合中。
    16        3. 遍历集合,按顺序,写出文本信息。
    17          */
    18         //创建双列集合,保存文本数据
    19         HashMap<String, String> objectObjectHashMap = new HashMap<>();
    20         //创建高效字符输入流对象
    21         BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\Users\ASUS\Desktop\截图\a.txt"));
    22         //创建高效字符输出流对象
    23         BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("aaaaa.txt"));
    24         //读取数据
    25         //定义变量
    26         String a = null;
    27         while ((a = bufferedReader.readLine()) != null) {
    28             //解析文本
    29             String[] split = a.split("\.");
    30             //保存到集合中
    31             // String str = new String(split[1].getBytes(), "utf-8");文本
    32             objectObjectHashMap.put(split[0], split[1]);
    33         }
    34         //释放资源
    35         bufferedReader.close();
    36         //遍历集合
    37         for (int i = 1; i <= objectObjectHashMap.size(); i++) {
    38             String key = String.valueOf(i);
    39             //获取文本中的内容
    40             String value = objectObjectHashMap.get(key);
    41             //写出拼接文本
    42             bufferedWriter.write(key + "." + value);
    43             //写出换行
    44             bufferedWriter.newLine();
    45         }
    46         //释放资源
    47         bufferedWriter.close();
    48     }
    49 }

     练习:记录自己电脑目录下书写了多少行代码.

     1 package com.heima.tongji;
     2 import java.io.BufferedReader;
     3 import java.io.File;
     4 import java.io.FileReader;
     5 import java.io.IOException;
     6 //文件搜索
     7 public class Demo01 {
     8     //定义常量记录代码个数
     9     static  int count=0;
    10     public static void main(String[] args)  {
    11         //创建File对象
    12         File dir = new File("D:\LULIANGHM");
    13         //调用打印目录方法
    14         try {
    15             System.out.println(printDir(dir));
    16         } catch (Exception e) {
    17             e.printStackTrace();
    18         }
    19     }
    20 
    21     //打印目录方法
    22     public static int printDir(File dir) throws IOException {
    23         //获取子文件和目录
    24         File[] files = dir.listFiles();
    25         //循环打印
    26         for (File file1 : files) {
    27             //判断是否是文件
    28             if (file1.isFile()) {
    29                 //判断是文件,判断文件名并输出文件绝对路径
    30                 if (file1.getName().endsWith(".java")) {
    31                     //定义高效字符输入流封装源文件。
    32                     BufferedReader bufferedReader = new BufferedReader(new FileReader(file1));
    33                     //定义变量用来存储读取的数据
    34                     String   line=null;
    35                     while ((line=bufferedReader.readLine())!=null){
    36                         //进行输出
    37                         // System.out.println(line);//输出目录下java文件
    38                         count++;
    39                     }
    40                 }
    41                 //判断当前查找到的文件是类型为目录的文件;
    42                  if(file1.isDirectory()){
    43                     printDir(file1);
    44                  }
    45                 }else {
    46                 // 是目录,继续遍历,形成递归
    47                 printDir(file1);
    48 
    49             }
    50         }
    51         return count;
    52     }
    53 }
  • 相关阅读:
    面经
    Onedrive云盘程序——OneManager小白设置指南
    Docker 命令
    Linux 命令
    Spring boot 返回参数移除null属性
    Springboot
    正则
    JVM内存模型
    缓冲和缓存的区别
    SpringBoot如何优雅的将静态资源配置注入到工具类中
  • 原文地址:https://www.cnblogs.com/luliang1215/p/10641512.html
Copyright © 2020-2023  润新知