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

  • 面试官:你说下对Java IO的理解?
  • 面试官:那要怎么读取字节流?
  • 面试官:你说的这些不是实例,我要的是能真正读取的?
  • 面试官:为什么加一层缓存流就能提高读取效率?
  • 面试官:那字符流读取呢?
  • 面试官:输出流你也讲一讲?
  • 面试官:那字节流和字符流有什么区别?

大家好,我是南哥。

一个Java学习与进阶的领路人,相信对你通关面试进入心心念念的公司有所帮助。

文章目录

  1. JavaI/O的理解
  2. 输入流
    1. 字节输入流抽象基类
    2. 字节输入流读取
    3. 提高读取效率
    4. 字符输入流
  3. 输出流
    1. 输出流
  4. 字节流和字符流区别

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%内容,订阅专栏后可继续查看/也可单篇购买

Java面试突击 文章被收录于专栏

👉以面试官面试的形式,涵盖了你怒怼大厂面试官、拿下大厂面试所需掌握的核心知识、面试重点! 👉相信一定对你顺利通关面试、拿到理想Offer有所帮助! 👉花费大量精力去制作本专栏,创作不易,各位的支持就是我创作的最大动力!

全部评论
牛啊
1 回复 分享
发布于 08-02 15:37 广东

相关推荐

3 4 评论
分享
牛客网
牛客企业服务