javaIO流之 字节与字符流认识
转载请注明:https://www.cnblogs.com/lanSeGeDiao/p/9312581.html
代码很简单:根据上图进行桥接(IO的设计采用装饰模式,所以是层层包裹的形式)
package com.mxdjava.basejava.myIO; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; /** * 目的 : * 1、测试非文本格式是否可以用字符流? * 2、测试缓冲字符流与缓冲字节流的速度对比? * 3、流关闭顺序? * 4、熟悉各个流的常用方法与构造器参数 */ public class MyIO { //head.mp4 为102M 的视频 public static void main(String[] args) { // charBuffer(); byteBuffer(); } /** * 测试结论: * 1、map4 等非文件格式也可以用字符流, 当前字符流的copy速度为 11133 * 2、测试 缓冲区为1024 、2048、10240 差别很小,使用默认的缓冲区即可 。 * 3、关闭流为逆序,可以理解为栈的数据结构先开的后关。 * 4、可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法。 所以这里指关闭了处理流。 */ public static void charBuffer() { BufferedWriter bw = null; BufferedReader br = null; try { br = new BufferedReader( //构造器可以规定其缓冲大小 new InputStreamReader( //构造器 转换流可以规定其编码格式 new FileInputStream( new File("F:\\IOTestFile\\head.mp4") ) , "utf-8") ); String line = ""; bw = new BufferedWriter( new OutputStreamWriter( //构造器 转换流可以规定其编码格式 new FileOutputStream("F:\\IOTestFile\\copy\\head10240.mp4") , "utf-8") ); long begin = System.currentTimeMillis(); while ((line = br.readLine()) != null) { bw.write(line); bw.flush(); } // 用时毫秒 System.out.println(System.currentTimeMillis() - begin);// 11133 bw.close(); br.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 测试结果: * 1、测试字节流的速度与字符流的速度对比 字节流的copy速度为240 我曹什么鬼 好快。 * 2、如果没有缓冲,用head.map测试很慢 * 3、如果非文本文件还是使用节点流吧。因为快的一P啊。 */ public static void byteBuffer() { BufferedInputStream bi=null; BufferedOutputStream bo =null; try { bi = new BufferedInputStream( new FileInputStream( new File("F:\\IOTestFile\\head.mp4") ) ); bo = new BufferedOutputStream( //构造器可指定缓冲区大小 new FileOutputStream ( new File("F:\\IOTestFile\\copy\\head.mp4") ) ); byte[] buf = new byte[1024]; int len =-1;//-1表示到达末尾 long begin = System.currentTimeMillis(); /** * 以下是java API 对read 的介绍: * 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中,以整数形式返回实际读取的字节数。 * 在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。 * */ while((len=bi.read(buf))!=-1) { /**API write介绍:将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流 */ bo.write(buf,0,len); } // 用时毫秒 System.out.println(System.currentTimeMillis() - begin); //240 bo.close(); bi.close(); } catch (Exception e) { e.printStackTrace(); } }
关键总结!
1、为什么字节流比字符流快的多 ?
字符流慢的原因是 :字节流在转换字符期间会进行一次编码,而且字符只出现在内存中所以这里消耗时间。
2、字节字符流的应用场景判断 ?
系统中大部分的数据都是二进制的形式如图片,视频等。所以最好使用字节流
如果是文本文件则使用字符流。
后面聊装饰模式会继续聊到IO。