字节流与字符流,字节流和字符流的使用哪个多?

首先我们要知道

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

而流有两种

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

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

而上一篇的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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券