第一章 缓冲流昨天学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流 。比如能够高效读写的缓冲流,能够 转换编码的转换流,能够持久化存储对象的序列化流等等 。这些功能更为强大的流,都是在基本的流对象基础之上 创建而来的,就像穿上铠甲的武士一样,相当于是对基本流对象的一种增强 。
1.1概述
缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流,按照数据类型分类:
字节缓冲流: BufferedInputStream,BufferedOutputStream
字符缓冲流: BufferedReader,BufferedWriter
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO 次数,从而提高读写的效率 。
1.2字节缓冲流
构造方法
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 毫秒1.3字符缓冲流
构造方法
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;// 循环读取,读取到最后返回nullwhile ((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();}}输出效果:对象程序员
推荐阅读
- 关于JavaScript及其对抓取和索引的影响
- 5大Java自动化测试框架
- redis缓存穿透,缓存击穿,缓存雪崩原因
- Redis缓存和MySQL数据一致性方案
- 全面解析Java日期时间API
- 利用nginx设置浏览器协商缓存
- 35个可以飞快提高千倍效率的Java语言代码小技巧,你值得拥有!
- 男女针灸戳身体这处缓解压力还补肾
- 经期痛不欲生?10个妙招助女人缓解痛经
- 胃病不用吃药也能治,天然"排毒王",每天吃1口,清幽门,舒缓胃不适