DataInputStream类与DataOutputStream类
这两个类分别是数据字节输入流与数据字节输出流
什么是数据文件呢?
将内存中的"int i=10;"写入到硬盘文件中,写进去的不是字符串,写进去的是二进制类型数据,带类型
public static void main(String[] args) throws Exception {
//创建数据字节输出流,它的构造方法也需要传入一个字节输出流
DataOutputStream dos=new DataOutputStream(new FileOutputStream("D:\\idea\\java code\\src\\learn\\IO\\temp04"));
//准备数据
byte b=10;
short s=11;
int i=13;
long l=1000L;
float f=3.14f;
double d=2.3;
boolean flag=true;
char c='c';
//写
dos.writeByte(b);
dos.writeShort(s);
dos.writeInt(i);
dos.writeLong(l);
dos.writeFloat(f);
dos.writeDouble(d);
dos.writeBoolean(flag);
dos.writeChar(c);
//刷新
dos.flush();
//关闭
dos.close();
}
文件中存储了数据文件,在读取的时候我们需要注意:读取数据文件时,需要知道数据文件的存储类型格式和存储顺序。
public static void main(String[] args)throws Exception {
//创建数据文件输入流
DataInputStream dis=new DataInputStream(new FileInputStream("D:\\idea\\java code\\src\\learn\\IO\\temp04"));
//读取数据(要使用该流读取数据,必须提前知道该文件中存储格式,存储顺序)
System.out.println(dis.readByte());//10
System.out.println(dis.readShort());//11
System.out.println(dis.readInt());//13
System.out.println(dis.readLong());//1000
System.out.println(dis.readFloat());//3.14
System.out.println(dis.readDouble());//2.3
System.out.println(dis.readBoolean());//true
System.out.println(dis.readChar());//c
//关闭
dis.close();
}
//针对于该数据文件中有不同的数据类型,必须按照存储的数据类型顺序来读取,才可以读取成功
我们想要存储java对象到硬盘时,就需要使用对象字节输入输出流
ObjectInputStream类与ObjectOutputStream类
当我们存储一个java对象时,需要该对象实Serializable接口,这个接口中没有需要实现的方法,属于一个标志接口。系统会根据属性为该类添加一个序列化版本号。
这边就可能会出现一个问题:
当我们存储一个实现序列化的java对象时,会有一个序列化版本号。
当我们读取该序列化对象的时候,可能该类的属性会发生了改变,那么反序列化版本号就会与序列化版本号不相匹配,那么就会出现异常。所以我们会为该类定义一个序列化版本号让它不要改变。
import java.io.Serializable;
//因为User实现了Serializable接口,JVM会特殊待遇,会给该类添加一个属性。
//static final long serialVersionUID 类的序列化版本号
public class User implements Serializable {
//不让系统自动生成,自己写一个序列化版本号
private static final long serialVersionUID = -9208351117053185643L;
//如果不想让某个属性参加序列化,就需要使用transient关键字修饰
transient String name;
int age;
User(String name){
this.name=name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
存储该对象
/*
java.io.ObjectOutputStream;序列化Java对象到硬盘{Serial}
java.io.ObjectInputStream;反序列化 将硬盘中的数据“反序列化”到JVM内存{DeSerial}
Compile 编译 {java---class}
DeCompile 反编译 {class---java}
*/
public class ObjectOutputStreamTest01 {
public static void main(String[] args) throws Exception {
//创建java对象
User u1=new User("Plko");
//创建输出流(序列化流)(JVM中的java对象状态保存到硬盘中)
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\idea\\java code\\src\\learn\\IO\\temp05"));
//写
oos.writeObject(u1);
//刷新
oos.flush();
//关闭
oos.close();
}
}
//java.io.InvalidClassException: learn.IO.User; local class incompatible: stream classdesc serialVersionUID = -9208351117053185643, local class serialVersionUID = -920835111705318563
//此异常就是因为版本号不一致会出现。
读取该对象
/*
反序列化
*/
public class ObjectInputStreamTest01 {
public static void main(String[] args) throws Exception {
//创建反序列化流
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\idea\\java code\\src\\learn\\IO\\temp05"));
//反序列化
Object o=ois.readObject();//该类的方法,用来读取java对象
User u1=(User) o;
System.out.println(u1.toString());//User{name=plko}
//关闭
ois.close();
}
}