文章目录:
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 }