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

  • 面试官:你说下对Java IO的理解?
  • 面试官:那要怎么读取字节流?
  • 面试官:你说的这些不是实例,我要的是能真正读取的?
  • 面试官:为什么加一层缓存流就能提高读取效率?
  • 面试官:读取之后呢,我怎么知道文件读取到末尾了?
  • 面试官:那字符流读取呢?
  • 面试官:输出流你也讲一讲?
  • 面试官:那字节流和字符流有什么区别?
  • 面试官:你刚刚提到转换流把字节输入流转换成字符输入流,可不可以倒过来?

大家好,我是南哥。

一个Java学习与进阶的领路人,跟着南哥我们一起Java成长。

文章目录

  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有所帮助! 👉花费大量精力去制作本专栏,创作不易,各位的支持就是我创作的最大动力!

全部评论
厉害厉害
1 回复 分享
发布于 2024-04-16 21:03 广东
666
点赞 回复 分享
发布于 2024-04-20 21:47 广东

相关推荐

05-04 21:11
门头沟学院 Java
面试官很和蔼,很尊重我。面试开始时,首先介绍了自己所工作的部门,当时说的太快,我听的不太清。接下来就是项目和八股了:1、你先介绍一下自己在做项目时遇到的难点,以及你是怎么解决的。答的稀烂,没提前准备。直接让面试官问我了,感觉面评会很差!2、那你先说一下怎么基于拦截器进行Token的校验以及刷新,答的越详细越好。3、为什么要用双层拦截器?4、知道ThreadLoacl的底层原理吗?说一下。5、知道死锁吗?解释一下死锁。6、死锁怎么解决呢?答了一次性申请所有资源和申请不到资源就自己释放自己的资源。面试官肯定了第二种,说不同的场景要用不同的解决方法。我甚至让面试官说一种场景,面试官被我干沉默了半分钟,说这不太好说,但还是说了一个场景。7、解释一下通过分布式锁以及stream消息实现高并发一人一单的优化。答的很烂,说了个大概,分布式锁实现一人一单,stream加快执行效率。8、用到了什么分布式锁呢?9、setnx的底层原理是什么?知道吗?10、假如现在有三个线程来下单了,库存只有两个了,那三个线程都判断库存充足,并且都是首次下单,是不是三个线程都能判断自己可以下单成功,这时你将三个线程中的用户id和优惠券id都放到消息队列中,这个时候只能消耗两条消息,还有一条消息怎么办?没回答上来(事实上,库存判断+是否下过单判断+减库存+写入Stream队列全部封装在一个Lua脚本中原子执行,Lua脚本具有原子性,多个线程即使并发执行EVAL命令,Redis仍会串行执行脚本逻辑,保证同一时刻只有一个线程完成判断与写入流程。)11、说一下是怎么使用工厂模式和策略模式实现布隆过滤器解决缓存穿透。12、解释布隆过滤器的底层原理。13、知道MySQL吗,说一下都有哪些索引?14、联合索引知道吗?底层是什么数据结构?15、解释一下B+树。16、联合索引的查询规则最左前缀法则的底层原理。答了JavaGuide上的,通过每个索引筛选掉一部分数据。面试官说,那直接从第二个索引也能进行筛选啊,怎么解释呢?17、说一下事务的隔离级别。18、脏读、不可重复读和幻读。19、场景题:N个数的文件中,怎么搜索到前10大的数字?答的是将数据先存到DB表中,再读取就可以了。面试官说,这效率太慢了,一般不采取。20、知道ReenTrantLock吗?说一下它的底层原理。就回答了个CLH锁,忘记AQS了.......算法题:股票问题Ⅲ,没撕出来,跟着carl刷到动态了,但还没刷到这一题,面试官提醒了我3次,还是不会。反问环节总结:人生中的第一次大厂面试,总时长1小时15分钟。自己准备的不够充分,回答问题逻辑性不够(回答的很多话都需要面试官去理解,然后问我是不是这样),很多知识点的底层原理也不太清楚。虽然结果不好,但是已经尽力了,毕竟从决定学java到现在不过才2个月,还是要多学多思考。
美团一面2111人在聊 查看20道真题和解析
点赞 评论 收藏
分享
05-09 14:09
已编辑
东北大学 Java
汇丰广州软开internship面试体验最差的一次约的13:45面试,进会议以后发现除了我还有一个面试的哥们,面试官说让他先面,让我等半个小时😅,不懂为什么这么安排时间,等的坐立难安。手撕:1.写一道算法题,英文题目,返回字符串中第一个字符的类型,非常简单,用Character类的方法就行。面试开始:三个面试官hr:1.自我介绍+why HSBC我回答的时候提到我比较喜欢英语,面试官反过来说喜欢英语为什么口语不行😅我真没感觉我口语有多不好,不知道他们到底要求到什么程度2.工作地点,实习时长是否可以接受技术面试官:3.刚才的代码题你觉得存在哪些问题回答没写注释,访问修饰符public可能会有隐私问题。面试官说没有考虑到输入数字的情况😤可是给的问题就是give u a string,无言以对。面试官总结说这是因为我没实习过,没有经验。4.之前为什么没去实习回答:之前准备保研考研,现在想就业。面试官说就算保研考研也该去实习😅说我意识不行5.让我平时多练练英语,多实习鼠鼠高考139,四级600,六级542,觉得自己真没有那么不堪,我要之前有实习还来你们这干嘛呢?到这我已经有点红温了6.问我学的ssm是什么,为什么学这个spring springmvc mybatis,主流常用7.项目为什么不用消息队列专盯着我没有的东西问hr:8.平时学习技术的动力是什么,怎么督促自己9.自己的方案不被同事认可怎么办回答:先自己改进,再咨询建议,实在不行换个方案hr:这么轻易就放弃了?到这已经彻底红温,想顺着网线爬过去10.遇到特别复杂的问题怎么解决反问:结果什么时候出 一周内几轮面试 一轮面的最难受的一次,全程不问八股,不问项目,面试官好像很赶时间,问的问题都很奇怪,而且他们说话的方式让我感觉像阴阳怪气一样。这实习不去也罢  
牛客955052028号:omg这么压迫 我聊的还挺开心的 唠嗑一样
点赞 评论 收藏
分享
评论
8
19
分享

创作者周榜

更多
牛客网
牛客企业服务