数据流
操作基本数据类型和字符串类型
DataInputStream 将文件中存储的基本数据类型和字符串写入内存的变量中
DataOutputStream 将内存中基本数据类型和字符串变量写出文件中
写出文件
public class Dates {
public static void main(String[] args) throws IOException {
String path = "D:\\b.txt";
//将内存中的基本数据类型写出到文件中
DataOutputStream dos = new DataOutputStream(new FileOutputStream(path));
dos.writeBoolean(false);
dos.writeUTF("hello");
dos.writeUTF("你好");
dos.close();
}
}
写出结果
这个结果不是给人看的是给程序看的,程序可以通过读这个文件将变量内容解析出来
读取文件
//将要解析的文件路径传进去
DataInputStream dis = new DataInputStream(new FileInputStream(path));
System.out.println(dis.readBoolean()); //false
System.out.println(dis.readUTF()); //hello
System.out.println(dis.readUTF()); //你好
dis.close();
读取的时候必须按写入的顺序读取
对象流
代码:将一个字符串对象转换成二进制写入到文件中–>序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
oos.writeObject("你好");
oos.writeObject(1);
oos.close();
代码:用程序读文件中的内容–>反序列化
1.操作字符串对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
System.out.println(ois.readObject()); //你好
System.out.println(ois.readObject()); //1
ois.close();
2.操作自定义对象
想要序列化的那个类必须已经实现Serializable接口否则会抛异常。
public class Test02 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
User u = new User(12,"lili");
//序列化对象,写出文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\Seria.txt"));
oos.writeObject(u);
oos.close();
//反序列化 读入文件
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\Seria.txt"));
System.out.println(ois.readObject());
}
}
当把一段内存序列化后,更改了这段内存,那么反序列化时会抛出异常,这是因为序列化时写入的内容和反序列化时读取的内容不一致,导致两个类不匹配了。
解决方法
给这个类加序列号SerialVersionUId:
idea 配置序列号
可序列化意味着实现了Serializable接口
总结
字节流 | 字符流 |
---|---|
InputStream | Reader |
FileInputStream | FileReader |
BufferedInputStream (装饰流/高效字节流) | BufferedReader |
DataStream (装饰流) | InputStreamReader(转换流) |
ObjectInputStream (装饰流) |