字节跳动还是字符跳动
字节跳动还是字符跳动
坚持原创,写好每一篇文章
很多人对于java的io流的概念不太理解,什么是流呢?它其实就是指的是能够产生数据和接收数据的对象。那么有字节流的操作和字符流的操作,我们分别看一下这两种
面向字节流的输入输出
InputStream和OutputStream主要是对字节的处理,我们经常是对文件的操作,而这用到的类就是FileInputStream和FileOutputStream
面向字符流的输入输出
Reader和Writer主要是对字符的处理,Reader类是用于读取字符流的抽象类,它的子类需要实现 read()方法 和 close()方法。Writer类用于写入字符流的抽象类,它的子类需要的实现 write()方法、flush() 方法和 close()方法。
两者的选择
对应大部分场景下,Reader和Writer的相关类可以替代面向字节流的操作,有一些场景还不得不用字节流操作,也就是说能用Reader和Writer就用Reader和Writer。
两者的转换
有时候我们既需要对字符流操作,有需要对字节流操作,这就需要两者进行转换了,
而InputStreamReader和OutputStreamWriter充当了适配器的角色,会将字节流转换为字符流。
InputStreamReader 读取字节并使用指定的字符集将它们解码为字符。字符集可以作为参数来指定或者使用系统默认字符集。InputStreamReader 的 read() 方法在每次调用都可能从底层字节输入流中读取一个或多个字节。为了实现字节到字符的有效转换,可以从底层流中预先读取比满足当前读取操作所需的更多的字节。 官方建议通过BufferedReader来装饰InputStreamReader提高效率
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
OutputStreamWriter 写入它的字符使用指定的字符集编码为字节。同样的,字符集可以由名称指定,也可以显式给出,或者可以接受平台的默认字符集。 OutputStreamWriter的每次调用 write() 方法都会导致调用编码转换器。生成的字节在写入底层输出流之前累积在缓冲区中,我们要指定足够大的缓冲区,而传递给 write() 方法的字符不会被缓冲。 我们可以使用BufferedWriter装饰 OutputStreamWriter 避免频繁调用编码转换器
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
总结
这篇文章主要讲了面向字节流涉及到的类和面向字符流涉及到的类,我们大部分情况使用面向字符流的操作,因为字符是在字节流之后实现的,所有它提供了相应的适配器:InputStreamReader和OutputStreamWriter可以实现从字节转为字符
- 点赞
- 收藏
- 关注作者
评论(0)