【面试官】那Java字节流和字符流有什么区别?

  • 面试官:你说下对Java IO的理解?
  • 面试官:那要怎么读取字节流?
  • 面试官:你说的这些不是实例,我要的是能真正读取的?
  • 面试官:为什么加一层缓存流就能提高读取效率?
  • 面试官:读取之后呢,我怎么知道文件读取到末尾了?
  • 面试官:那字符流读取呢?
  • 面试官:输出流你也讲一讲?
  • 面试官:那字节流和字符流有什么区别?
  • 面试官:你刚刚提到转换流把字节输入流转换成字符输入流,可不可以倒过来?
  • 👉以贴近现实的【面试官面试】形式涵盖大部分Java程序员需要掌握的后端知识、面试问题
  • 📚本期是《Java IO系列》,其他系列博客请订阅专栏《Java Offer训练营》
  • ❤创作不易,不妨点赞、收藏、关注支持一下

文章目录

  1. IO的理解
  2. 输入流
    1. 字节输入流读取方法
    2. 字节输入流读取实例
    3. 缓存流提高读取效率
    4. 字节输入流末尾
    5. 字符输入流
  3. 输出流
  4. 字节流和字符流区别
  5. 转换流

1. IO的理解

面试官:你说下对Java IO的理解?

好的面试官,Java IO有两个参与对象,一个是IO源端,一个是想要和IO源端通信的各种接收端如控制台、文件等,我们程序要保证的就是顺利的读取和顺利的写入。

2. 输入流

2.1 字节输入流读取方法

面试官:那要怎么读取字节流?

读取字节的抽象基类是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
    

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系列、多线程系列等等 👉制作不易,各位的支持是我创作的最大动力

全部评论
厉害厉害
1
送花
回复
分享
发布于 04-16 21:03 广东
666
点赞
送花
回复
分享
发布于 04-20 21:47 广东
滴滴
校招火热招聘中
官网直投
🐮
点赞
送花
回复
分享
发布于 04-25 23:37 广东

相关推荐

一面 #一面# #OPPO# #oppo# 项目相关:①用户的哪些信息存到Redis中?数据库存什么?②为什么有数据库还要使用Redis?Redis有什么特殊性、不可替代性?③手机号直接放到Redis或数据库中的信息安全性怎么保证?④缓存穿透/缓存雪崩/缓存击穿问题怎么解决的?⑤Redis和数据库的一致性怎么保证的?怎么保证数据库和缓存操作的原子性?⑦怎么加索引?索引是越多越好吗?为什么?八股:①OSI七层模型和TCP四层模型?为什么有这两种模型?②计算机网络中的常见协议有哪些?③tcp和udp协议的区别?怎么通过udp实现tcp的效果?④一个网络包在公网中是如何具体从原地址传输到目的地址,这个具体的这个路由过程说一下?⑤一个数据包在局域网,它是怎么找到目的地址的?⑥假设现在公网 IP 地址走ipv4,现在这公网 IP地址不够,我们一般用什么方式去处理?⑦操作系统中进程和线程的关系?⑧知道协程吗?⑨死锁怎么避免?⑩常用的数据结构有哪些?⑩①hashmap的底层数据结构?哈希碰撞了怎么办?⑩②空间换时间了解吗?举个例子?二面 #二面# 项目:①session不共享问题怎么解决的?②怎么保证用户登录时从token查到的用户数据的信息安全性?③用返回空值+ttl解决缓存穿透时,出现查询异常(比如说网络延迟或者超时)处理异常的情况和跟查询本身是为空的这两种情况,怎么区分开?八股:①单例模式的几种实现方式?解决的是什么问题?什么场景下会使用单例模式?②hashmap怎么解决哈希碰撞的?③list可以使用for循环删除掉某些元素吗?正着删?倒着删?迭代器删可以吗?④线程池为什么要先放满阻塞队列再申请空闲线程,而不是直接创建到最大线程数?⑤get和post的区别?post为什么要先发起一个option请求?⑥http和https的区别?https是怎么加密的?⑦什么时候使用/不使用索引?表数据量小需要使用索引吗?性别字段使用索引吗?⑧唯一索引可以为空吗?普通索引可以为空吗?⑨上亿大表的深分页查询问题怎么解决?为什么越往后翻页越慢?⑩4个g的文件存手机号(可重复),不依赖任何中间件和布隆过滤器,怎么找到一个指定的手机号?2024/4/26 10/30
点赞 评论 收藏
转发
5 18 评论
分享
牛客网
牛客企业服务