zoukankan      html  css  js  c++  java
  • 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。
        
  • 相关阅读:
    单元测试之PowerMock
    ClickHouse单机安装
    Oracle19C ADG主备切换问题处理
    oracle dbms_metadata.get_ddl的使用方法总结
    SCN太大引发ORA-600[2252]
    异步IO ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O
    Oracle Linux 7.8 多路径(Multipath)+Udev绑定磁盘
    Oracle定期清理10日分区数据
    linux如何使用umount命令强制卸载文件系统
    临时表空间使用率和被谁占用情况
  • 原文地址:https://www.cnblogs.com/lanSeGeDiao/p/9312581.html
Copyright © 2011-2022 走看看