【面试官】那Java字节流和字符流有什么区别?
- 面试官:你说下对Java IO的理解?
- 面试官:那要怎么读取字节流?
- 面试官:你说的这些不是实例,我要的是能真正读取的?
- 面试官:为什么加一层缓存流就能提高读取效率?
- 面试官:读取之后呢,我怎么知道文件读取到末尾了?
- 面试官:那字符流读取呢?
- 面试官:输出流你也讲一讲?
- 面试官:那字节流和字符流有什么区别?
- 面试官:你刚刚提到转换流把字节输入流转换成字符输入流,可不可以倒过来?
- 👉以贴近现实的【面试官面试】形式涵盖大部分Java程序员需要掌握的后端知识、面试问题
- 📚本期是《Java IO系列》,其他系列博客请订阅专栏《Java Offer训练营》
- ❤创作不易,不妨点赞、收藏、关注支持一下
文章目录
- IO的理解
- 输入流
- 字节输入流读取方法
- 字节输入流读取实例
- 缓存流提高读取效率
- 字节输入流末尾
- 字符输入流
- 输出流
- 字节流和字符流区别
- 转换流
1. IO的理解
面试官:你说下对
Java IO
的理解?
好的面试官,Java IO有两个参与对象,一个是IO源端,一个是想要和IO
源端通信的各种接收端如控制台、文件等,我们程序要保证的就是顺利的读取和顺利的写入。
2. 输入流
2.1 字节输入流读取方法
面试官:那要怎么读取字节流?
读取字节的抽象基类是InputStream,这个基类提供了3个方法可以来读取字节流。
-
从输入流读取下一个数据字节,值字节以0到255范围内的
int
返回。public abstract int read() throws IOException
-
从输入流读取一定数量的字节并将它们存储到缓冲区数组
b
中。public int read(byte b[]) throws IOException
-
从输入流读取最多
len
个字节的数据到字节数组中。public int read(byte b[], int off, int len) throws IOException
2.2 字节输入流读取实例
面试官:你说的这些不是实例,我要的是能真正读取的?
那可以用抽象基类的子类实现来读取,例如文件流FileInputStream。
new FileInputStream(SOURCE_PATH)
我们还可以在外面加一层缓存字节流来提高读取效率。
new BufferedInputStream(new FileInputStream(SOURCE_PATH))
如果要把缓存流换成字符流来承接,方便使用readLine()读取某一行的话,可以使用转换流把字节输入流转换成字符输入流。
new BufferedReader(new InputStreamReader(new FileInputStream(SOURCE_PATH)))
2.3 缓存流提高读取效率
面试官:为什么加一层缓存流就能提高读取效率?
是这样的。因为直接使用 FileInputStream
读取文件的话,每次调用 read()
都是从磁盘读取一个字节,而每次读取都是一次系统调用。系统,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java Offer训练营 文章被收录于专栏
👉以贴近现实的【面试官面试】形式帮助你系统学习后端技术 👉成体系知识帮你在后端进阶,每一道问答助你怒怼大厂面试官,收获大厂offer 👉《Java Offer训练营》包含Redis系列、MySQL系列、Kafka系列、ZooKeeper系列、JVM系列、多线程系列等等 👉制作不易,各位的支持是我创作的最大动力