zoukankan      html  css  js  c++  java
  • 字节流与字符流,字节流和字符流的使用哪个多?

    首先我们要知道

    在程序中所有的数据都是以流的方式进行传输或保存的

    而流有两种

    字节流用来处理字节或二进制对象

    字符流主要用来处理字符或字符串,一个字符占两个字节

    而上一篇的java 读写操作大文件 BufferedReader和RandomAccessFile

    BufferedReader正是处理字符流,RandomAccessFile则是处理字节流

    两类都分为输入和输出操作。

    在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream

    在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成

    字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的

    字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容


    这里再说一个面试的坑,字节流和字符流的使用哪个多?

    没过脑子的时候,我说了buffer的字符流,毕竟加快处理,节约硬盘io。从性能上说一定是好的用的多了。

     

    但是节流是最基本的,一个字符占两个字节就可以看出,甚至源码使用字符流的时候,也是先转成字节在变成字符所以使用字节流的操作是最多的

     

    从上一篇的操作中可以看出,想要用buffer,你还是要先取字节流,再转成字符流 orz

     

    //RandomAccessFile操作大数据文件
    FileChannel channel = new RandomAccessFile(input_path, "r").getChannel(); //BufferedReader操作大数据文件 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(input_path))); int bufferSize = 10 * 1024 * 1024; BufferedReader in = new BufferedReader(new InputStreamReader(bis, "utf-8"), bufferSize);

     

    当然我的代码做不得准,看一下java源码。FileReader的构造器就是FileInputStream,也就是字节流。只是操作的时候用了buffer变成了字符流而已。

        public FileReader(String fileName) throws FileNotFoundException {
            super(new FileInputStream(fileName));
        }

    这算是一个很细的坑,不管有没有了解字节流字符流,都会踩一次啊。

    那么,看了源码之后,我们总算明白为什么大多数io操作,我们都不直接使用字符流的操作,而是取出字节流,把字节流变成我们希望的样子,才用字符流操作吧?

    因为,java的默认字符流操作,并不一定适用于我们的需求,所以程序员需要diy。


  • 相关阅读:
    【2017 Multi-University Training Contest
    【“玲珑杯”ACM比赛 Round #20 H】康娜的数学课
    【hdu 6181】Two Paths
    Cache coherence protocol
    C#实现图片的无损压缩
    收集一些常用的正则表达式
    收集一些常用的正则表达式
    收集一些常用的正则表达式
    Sql中存储过程的定义、修改和删除操作
    Sql中存储过程的定义、修改和删除操作
  • 原文地址:https://www.cnblogs.com/ydymz/p/10143630.html
Copyright © 2011-2022 走看看