【面试官】那Java字节流和字符流有什么区别?
- 面试官:你说下对Java IO的理解?
- 面试官:那要怎么读取字节流?
- 面试官:你说的这些不是实例,我要的是能真正读取的?
- 面试官:为什么加一层缓存流就能提高读取效率?
- 面试官:那字符流读取呢?
- 面试官:输出流你也讲一讲?
- 面试官:那字节流和字符流有什么区别?
大家好,我是南哥。
一个Java学习与进阶的领路人,相信对你通关面试进入心心念念的公司有所帮助。
文章目录
- JavaI/O的理解
- 输入流
- 字节输入流抽象基类
- 字节输入流读取
- 提高读取效率
- 字符输入流
- 输出流
- 输出流
- 字节流和字符流区别
1. Java I/O的理解
面试官:你说下对Java IO的理解?
Java I/O有两个参与对象,一个是I/O源端,一个是想要和I/O
源端通信的各种接收端,比如程序控制IDEA控制台输出、读取文件A写入文件B等,我们程序要保证的就是IO流的顺利读取和顺利写入。JDK把对Java IO的支持都放在了package java.io
包下,南哥数了数,一个有86个类和接口。
我们看下package java.io
包最常用的Reader和Writer接口,他们的作者都是Mark Reinhold。这位老哥是谁?他是Oracle Java平台组的首席架构师,也是字符流读取器和写入器的首席工程师。这么有来头,看来Java I/O的程序设计不简单,我们可以从中学到不少好用的东西。
/**
* @author Mark Reinhold
* @since JDK1.1
*/
public abstract class Reader implements Readable, Closeable { }
public abstract class Writer implements Appendable, Closeable, Flushable { }
2. 输入流
2.1 字节输入流抽象基类
面试官:那要怎么读取字节流?
我们先讲输入流,后面再讲下输出流。输入流又分为字节流和字符流,顾名思义,字节流按字节来读取,操作的数据单元是8位的字节;而字符流按字符来读取,操作的数据单元是16位的字符。
读取字节的抽象基类是InputStream,这个基类提供了3个方法给我们来读取字节流。
(1)从输入流读取下一个数据字节,值字节以0到255范围内的int
返回。
public abstract int read() throws IOException
(2)从输入流读取一定数量的字节并将它们存储到缓冲区数组b
中。
public int read(byte b[]) throws IOException
(3)从输入流读取最多len
个字节的数据到字节数组中。
public int read(byte b[], int off, int len) throws IOException
大家注意以上方法的返回参数都是int类型,当正常读取时,int返回的是读取的字节个数;而当int返回-1,就表明输入流到达了末尾。
2.2 字节输入流读取
面试官:你说的这些不是实例,我要的是能真正读取的?
上文的是抽象的接口,本身并不具备实际的功能。真正能够读取文件的是InputStream
抽象基类的子类实现,例如文件流FileInputStream,有了他,我们读取音频、视频、gif等等都不是问题。
// 文件流读取文件
FileInputStream stream = new FileInputStream(SOURCE_PATH);
我们还可以在外面加一层缓存字节流来提高读取效率,在外层套上BufferedInputStream对象,为什么可以提高读取效率我下文会讲到。
BufferedInputStream stream = new BufferedInputStream(new FileInputStream(SOURCE_PATH));
以上通过字节流我们是以n个字节来读取的,如果要用readLine()
读取某一行这种场景下就不适用了。我们可以把缓存字节流换成缓存字符流来承接,使用InputStreamReader
转换流把字节输入流转换成字符输入流。
如下代码所示。
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(SOURCE_PATH)));
2.3 提高读取效率
面试官:为什么加一层缓存流就能提高读取效率?
为什么加一层缓存
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
👉以面试官面试的形式,涵盖了你怒怼大厂面试官、拿下大厂面试所需掌握的核心知识、面试重点! 👉相信一定对你顺利通关面试、拿到理想Offer有所帮助! 👉花费大量精力去制作本专栏,创作不易,各位的支持就是我创作的最大动力!