Java——5个关于Java中I/O流的面试题

Posted 张起灵-小哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java——5个关于Java中I/O流的面试题相关的知识,希望对你有一定的参考价值。

文章目录:

1.Java 中有几种类型的流?

2.字节流如何转为字符流?

3.字节流和字符流的区别?

4.什么是 java 序列化,如何实现 java 序列化?

5.如何将一个 java 对象序列化到文件里?


1.Java 中有几种类型的流?

  • 按照流的方向:输入流(inputStream:硬盘 ---> 内存)和输出流(outputStream:内存 ---> 硬盘)。
  • 按照读取数据方式不同进行分类:字节流和字符流。字节流继承于 InputStream 和 OutputStream, 字符流继承于InputStreamReader 和 OutputStreamWriter 。
  • 凡是“类名”以 Stream 结尾的流都是字节流,以Reader/Writer结尾的都是字符流。
  • Java I/O流这块有四大家族:(全部都是抽象类)
  1. java.io.InputStream       字节输入流
  2. java.io.OutputStream    字节输出流
  3. java.io.Reader               字符输入流
  4. java.io.Writer                  字符输出流
  • 所有的流都实现了:
                java.io.Closeable接口,都是可关闭的,都有close()方法。
                流毕竟是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,
                不然会耗费(占用)很多资源。养成好习惯,用完流一定要关闭。

  • 所有的输出流都实现了:
                java.io.Flushable接口,都是可刷新的,都有flush()方法。
                养成一个好习惯,输出流在最终输出之后,一定要记得flush()
                刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据
                强行输出完(清空管道!)刷新的作用就是清空管道。
                注意:如果没有flush()可能会导致丢失数据。

2.字节流如何转为字符流?

  • 字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。
  • 字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。

3.字节流和字符流的区别?

  • 字节流读取的时候,读到一个字节就返回一个字节。
  • 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。
  • 字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
  • 字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStream、InputStream字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。在程序中一个字符等于两个字节,java 提供了 Reader、Writer 两个专门操作字符流的类。 

4.什么是 java 序列化,如何实现 java 序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序 列 化 的 实 现 : 将 需 要 被 序 列 化 的 类 实 现 Serializable 接 口 , 该 接 口 没 有 需 要 实 现 的 方 法 , implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream 对象的 writeObject(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。 

5.如何将一个 java 对象序列化到文件里?

在 java 中能够被序列化的类必须先实现 Serializable 接口,该接口没有任何抽象方法只是起到一个标记作用。 

public class Test {
    public static void main(String[] args) throws Exception {
        //对象输出流
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("D://obj")));
        objectOutputStream.writeObject(new User("zhangsan", 100));
        objectOutputStream.close();
        //对象输入流
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("D://obj")));
        User user = (User) objectInputStream.readObject();
        System.out.println(user);
        objectInputStream.close();
    }
}
import java.io.Serial;
import java.io.Serializable;

/**
 *
 */
public class User implements Serializable {

    @Serial
    private static final long serialVersionUID = -4172519739434112159L;
    private String name;
    private Integer id;

    public User() {
    }

    public User(String name, Integer id) {
        this.name = name;
        this.id = id;
    }

    //getter and setter
    //toString
}

 

以上是关于Java——5个关于Java中I/O流的面试题的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO和IO的区别

Java NIO与IO的区别和比较

高薪程序员&面试题精讲系列22之说说Java的IO流,常用哪些IO流?

JAVA面试题一 之 io流的操作

Java——6个关于Java异常处理的面试题

java 比较骚的面试题 BIO/AIO/NIO 有什么区别