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。
    
posted @ 2018-07-15 11:09  蓝色丶格调  阅读(315)  评论(0编辑  收藏  举报