字节流与字符流,字节流和字符流的使用哪个多? java 读写操作大文件 BufferedReader和RandomAccessFile

首先我们要知道

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

而流有两种

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

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

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


猜你喜欢

转载自www.cnblogs.com/ydymz/p/10143630.html