java 之IO常用字节字符流认识

转载请注明: https://www.jianshu.com/p/b25992906b12

java 之IO常用字节字符流认识_第1张图片
image

代码很简单:根据上图进行桥接(IO的设计采用装饰模式,所以是层层包裹的形式)
"//说明 :为了让注释更加清晰,在注释两边加了双引号,如果需要测试代码,请自行去掉"
"/**
 * 目的 :
 * 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. 字节字符流的应用场景判断 ?

系统中大部分的数据都是二进制的形式如图片,视频等。所以最好使用字节流
如果是文本文件则使用字符流。

你可能感兴趣的:(java 之IO常用字节字符流认识)