面试官:你说下对Java IO的理解?     面试官:那要怎么读取字节流?     面试官:你说的这些不是实例,我要的是能真正读取的?     面试官:为什么加一层缓存流就能提高读取效率?     面试官:读取之后呢,我怎么知道文件读取到末尾了?     面试官:那字符流读取呢?     面试官:输出流你也讲一讲?     面试官:那字节流和字符流有什么区别?     面试官:你刚刚提到转换流把字节输入流转换成字符输入流,可不可以倒过来?          大家好,我是南哥。   一个Java学习与进阶的领路人,跟着南哥我们一起Java成长。   文章目录            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() 都是从磁盘读取一个字节,而每次读取都是一次系统调用。系统调用是操作系统层面的调用,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。   而如果使用缓存流,一次性从文件里读取多个字节到缓存                               
点赞 8
评论 2
全部评论

相关推荐

不愿透露姓名的神秘牛友
04-30 18:05
空屿编号:你把墨镜摘下来是不是这样😭
点赞 评论 收藏
分享
想做乐观锁:都不用AI,咱们都古法编程吧,让节奏慢一点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务