输入和输出处理
字符流
字符输入流
java.io.Reader
- InputStreamReader 将字节输入流转换为字符流
- java.io.FileReader
构造方法:
- FileReader(String fileName) 根据文件路径构建字符输入流对象
- FileReader(File file) 根据 File 对象构建字符输入流对象
常用方法:
- read() : int 读取一个字符
- read(char[] cbuf) : int 读取一个字符数组的内容,返回的是读取了多少个字符到字符数组中,返回 -1 代表读取完毕
- close() : void 关流
字符输出流
java.io.Writer
- OutputStreamWriter 将字节输出流转换为字符流
- java.io.FileWriter
构造方法:
- FileWriter(String fileName)
- FileWriter(String fileName, boolean append)
- FileWriter(File file)
- FileWriter(File file, boolean append)
常用方法:
-
write(int c) : void 输出一个字符
-
write(char[] cbuf) : void 输出一个字符数组
-
write(char[] cbuf, int off, int len) : void 输出一个字符数组的一部分
-
write(String str) : void 输出一个字符串
-
write(String str, int off, int len) : void 输出一个字符串的一部分
-
close() : void 关流
-
flush() : void 刷新缓冲区
高效字符流
java.io.BufferedReader
构造方法:
- BufferedReader(Reader in)
常用方法:
- readLine() : String 读取一行
- …
java.io.BufferedWriter
构造方法:
- BufferedWriter(Writer out)
常用方法:
- newLine() : void 输出一个换行符
- …
高效字符流的其他方法和上面的基本字符流一致。
读取各种类型数据(了解)
DataInputStream和DataOutputStream
构造方法:
- DataInputStream(InputStream in)
- DataOutputStream(OutputStream out)
常用方法:
- readUTF() : String
- readInt() : int
- readDouble() : double
- readChar() : char
- readBoolean() : boolean
- writeUTF(String) : void
- writeInt(int) : void
- writeDouble(double) : void
- writeChar(char) : void
- writeBoolean(boolean) : void
- close() : void
序列化(对象流)
ObjectInputStream :反序列化
构造方法:
- ObjectInputStream(InputStream in)
常用方法:
- readObject() : Object 读取对象
ObjectOutputStream :序列化
构造方法:
- ObjectOutputStream(OutputStream out)
常用方法:
- writeObject(Object obj) : void 写入对象
在输出对象时,该对象所属的类必须实现序列化接口。
public class 类 implements Serializable { }
序列化和反序列化
【强制】 序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
说明: 注意 serialVersionUID 不一致会抛出序列化运行时异常。
java.io.InvalidClassException: demo04.User; local class incompatible: stream classdesc serialVersionUID = 6956675782234049705, local class serialVersionUID = -2472659678273126616
如果序列化类,没有指定序列化版本 UID,它在进行序列化时,系统会根据类的信息自动生成一个 UID。
但这种方式会导致,当你改动了序列化类(新增属性),序列化版本 UID 就会发生变化,无法进行兼容性的升级。原有序列化的内容无法反序列化回来。(因为 UID 不同!)
所以,我们可以在序列化类中添加一个 UID,这样是否允许兼容性升级,可以由我们自己来控制。