前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字节流与字符流,字节流和字符流的使用哪个多?

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

作者头像
ydymz
发布2018-12-27 16:08:09
8880
发布2018-12-27 16:08:09
举报
文章被收录于专栏:lgp20151222lgp20151222

首先我们要知道

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

而流有两种

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

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

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

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

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

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

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

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

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

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

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

但是正如开头所说,在程序中所有的数据都是以流的方式进行传输或保存的,所以使用字节的操作是最多的。

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

代码语言:javascript
复制
//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变成了字符流而已。

代码语言:javascript
复制
    public FileReader(String fileName) throws FileNotFoundException {
        super(new FileInputStream(fileName));
    }

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档