当前位置: 首页 > news >正文

缓冲流

昨天学习了基本的一些六,作为IO流的入门,今天学习一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来,相当于是对基本流对象的一种增强。

概述

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

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

字节缓冲流:BufferInputStream,BufferOutputStream

字符缓冲流:BufferReader,BufferWriter

 

(1)字节缓冲输出流BufferOutputStream

构造方法

构造方法摘要
BufferedOutputStream(OutputStream out)
          创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

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

 参数:OutputStream out 字节输出流,我们可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率。

           int size:指定缓冲流内部缓冲区的大小,不指定就是默认大小

缓冲流使用步骤:

1.创建一个字节输出流对象FileOutputStream,构造方法绑定输出的目的地。

2.创建BufferedFileOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象写入效率。

3.使用BufferedFileOutputStream对象中的write方法,把数据写入到内部缓冲区中。

4.使用BufferedFileOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中。

5.释放资源(close方法本身就是先刷新数据再关闭,故写5可不写4)。

// 1.创建一个字节输出流对象FileOutputStream,构造方法绑定输出的目的地。
FileOutputStream fos = new FileOutputStream("D:\\a\\d.txt");
// 2.创建BufferedFileOutputStream对象,构造方法中传递FileOutputStream对象
// 提高FileOutputStream对象效率。
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write("我把数据写入到内部缓冲区中".getBytes());
// 4.使用BufferedFileOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中。
bos.flush();
// 5.释放资源
bos.close();

(2)字节缓冲输入流BufferInputStream

构造方法

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

 参数:InputStream out 字节输出流,我们可以传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读出效率。

           int size:指定缓冲流内部缓冲区的大小,不指定就是默认大小

缓冲流使用步骤:

1.创建一个字节输出流对象FileInputStream,构造方法绑定要读取的数据源。

2.创建BufferedFileInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象读取效率。

3.使用BufferedFileInputStream对象中的read方法,读取文件。

4.释放资源。

// 1.创建一个字节输出流对象FileInputStream,构造方法绑定要读取的数据源。
FileInputStream fis  = new FileInputStream("D:\\a\\d.txt");
// 2.创建BufferedFileInputStream对象,构造方法中传递FileInputStream对象
BufferedInputStream bis = new BufferedInputStream(fis);
int len = 0;
// 3.使用BufferedFileInputStream对象中的read方法,读取文件。
while((len = bis.read()) != -1){
    System.out.println(len);
}
bis.close(); // 4.释放资源

(3)字符缓冲输出流BufferWriter

构造方法

构造方法摘要
BufferedWriter(Writer out)
          创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
          创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

 

 参数:Writer out 字符输出流,我们可以传递FileWriter,缓冲流会给FileWriter增加一个缓冲区,提高FileWriter的读出效率。

           int size:指定缓冲流内部缓冲区的大小,不指定就是默认大小

特有方法

使用步骤:

1.创建一个字节输出流对象FileWriter,构造方法绑定输出的目的地。

2.创建BufferedFileWriter对象,构造方法中传递FileWriter对象,提高FileWriter对象写入效率。

3.使用BufferedFileWriter对象中的write方法,把数据写入到内部缓冲区中。

4.使用BufferedFileWriter对象中的方法flush,把内部缓冲区中的数据,刷新到文件中。

5.释放资源(close方法本身就是先刷新数据再关闭,故写5可不写4)。

// 1.创建一个字节输出流对象FileWriter,构造方法绑定输出的目的地。
FileWriter fw = new FileWriter("D:\\a\\e.txt");
// 2.创建BufferedFileWriter对象,构造方法中传递FileWriter对象,提高FileWriter对象写入效率。
BufferedWriter bw = new BufferedWriter(fw);
// 3.使用BufferedFileWriter对象中的write方法,把数据写入到内部缓冲区中。
for (int i = 0; i < 10; i++) {
    bw.write(i);
    bw.newLine(); // 换行符
}
// 4.使用BufferedFileWriter对象中的方法flush,把内部缓冲区中的数据,刷新到文件中。
bw.flush();
// 5.释放资源
bw.close();

(4)字符缓冲输入流BufferReader

构造方法

 

构造方法摘要
BufferedReader(Reader in)
          创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
          创建一个使用指定大小输入缓冲区的缓冲字符输入流。

 参数:Reader out 字节输出流,我们可以传递FileReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader的读出效率。

           int size:指定缓冲流内部缓冲区的大小,不指定就是默认大小

特有方法

public String readLine():读一行文字。

行终止符:读到换行符时认尾某行终止。

返回值:包含改行内容的字符串,不包含任何行终止符,如果已到该流末尾,则返回null。

使用步骤:

1.创建一个字节输出流对象FileReader,构造方法绑定要读取的数据源。

2.创建BufferedReader对象,构造方法中传递FileReader对象,提高FileReader对象读取效率。

3.使用BufferedReader对象中的read/readLine方法,读取文件。

4.释放资源。

// 1.创建一个字节输出流对象FileReader,构造方法绑定要读取的数据源。
FileReader fr = new FileReader("D:\\a\\c.txt");
// 2.创建BufferedReader对象,构造方法中传递FileReader对象
BufferedReader br = new BufferedReader(fr);
// 3.使用BufferedReader对象中的read/readLine方法,读取文件。
String str = " ";
while((str = br.readLine()) == null){
    System.out.println(str);
}
// 4.释放资源。
br.close();

题目练习:乱序文本排序

// 字符缓冲输入流,按行读取文件
BufferedReader br = new BufferedReader(new FileReader("D:\\a\\无序出师表.txt"));
// HashMap存储键值对
HashMap<Integer,String> map = new HashMap<>();
// 按行读取,并分割
String line = " ";
while((line = br.readLine()) != null){ // 按行读取
    // 强转,注意转义符
    map.put(Integer.valueOf(line.split("\\.")[0]),line.split("\\.")[1]);
}
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\a\\有序出师表.txt"));
// HashMap无序,以计算德hashcode来排序,此处刚好有序
Set<Integer> keySet = map.keySet();
for(int key : keySet){
    // 拼接key和value写入到缓冲输出流
    bw.write(key + "." + map.get(key));
    bw.newLine(); // 换行
}
// 释放资源
br.close();
bw.close();

 

相关文章:

  • 转换流InputStreamReader类和OutputStreamWriter(字符编码和字符集)
  • 序列化与反序列化和transient瞬态关键字
  • 打印流
  • 前缀(波兰)、中缀、后缀(逆波兰)表达式
  • 递归(回溯之迷宫问题+八皇后)
  • 算法题-Java实现:从 1 到 n 整数中 1 出现的次数(时间复杂度O(logn))
  • 软件结构/网络通信协议/IP地址/端口号
  • TCP通信程序
  • C/S结构文件上传案例
  • 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)
  • 二分查找和插值查找
  • 树-二叉树(前中后序遍历+按值查找+删除节点)
  • 位运算应用场景(每遇更新)
  • 工作期间常用的linux命令
  • 判断传入的句子是中文还是英文还是中英混合并分割的函数
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Babel配置的不完全指南
  • co.js - 让异步代码同步化
  • exports和module.exports
  • linux学习笔记
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python利用正则抓取网页内容保存到本地
  • 闭包,sync使用细节
  • 番外篇1:在Windows环境下安装JDK
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 我的zsh配置, 2019最新方案
  • 因为阿里,他们成了“杭漂”
  • 1.Ext JS 建立web开发工程
  • 如何用纯 CSS 创作一个货车 loader
  • 我们雇佣了一只大猴子...
  • 整理一些计算机基础知识!
  • 昨天1024程序员节,我故意写了个死循环~
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $refs 、$nextTic、动态组件、name的使用
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (12)Hive调优——count distinct去重优化
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (三十五)大数据实战——Superset可视化平台搭建
  • (转)LINQ之路
  • (转)平衡树
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .FileZilla的使用和主动模式被动模式介绍
  • .gitignore文件—git忽略文件
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core WebAPI中封装Swagger配置
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net 中viewstate的原理和使用
  • .NET性能优化(文摘)
  • .NET中的Exception处理(C#)
  • /proc/vmstat 详解