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

简介: 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 个字节)时。先去查指定的编码表,将查到的字符返回。

·       字节流可以处理所有类型数据,如:图片,MP3AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

·       字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStreamInputStream字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。在程序中一个字符等于两个字节,java 提供了 ReaderWriter 两个专门操作字符流的类。 


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
}
相关文章
|
26天前
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
163 60
|
2天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
33 14
|
5天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13
|
25天前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
65 16
|
22天前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
55 9
|
27天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
59 12
|
1月前
|
监控 Dubbo Java
Java Dubbo 面试题
Java Dubbo相关基础面试题
|
1月前
|
SQL Java 数据库连接
Java MyBatis 面试题
Java MyBatis相关基础面试题
|
1月前
|
存储 监控 算法
Java JVM 面试题
Java JVM(虚拟机)相关基础面试题
|
1月前
|
SQL 监控 druid
Java Druid 面试题
Java Druid 连接池相关基础面试题

热门文章

最新文章