Data流
概念
data流:可以直接把数据类型也保存,读写在文件中,当对于一个数据读写需要保存数据类型的时候,可以使用data流
使用
/*
Data流 | 基本数据类型流 : 读写数据+保留数据类型->基本数据类型|字符串
是字节流的功能流
DataInputStream Data输入流
新增功能 : readXxx()
DataOuutputStream Data输出流
新增功能 : writeXxx()
注意: 读入与写出的顺序保持一致
读入数据的时候必须从源文件中读入,否则抛出异常 java.io.EOFException
*/
//写出
public static void wirte(String path) throws IOException {
//1.构建输出流
DataOutputStream os = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path)));
//2.准备数据
int i = 100;
char ch = 'a';
boolean flag = false;
String str = "哈哈";
//3.写出
os.writeInt(i);
os.writeChar(ch);
os.writeBoolean(flag);
os.writeUTF(str);
//4.刷出
os.flush();
//5.关闭
os.close();
}
//读入
public static void read(String path) throws IOException {
//1.构建输入流
DataInputStream is = new DataInputStream(new BufferedInputStream(new FileInputStream(path)));
//2.读入
int i = is.readInt();
char ch = is.readChar();
boolean flag = is.readBoolean();
String msg = is.readUTF();
//3.处理数据
System.out.println(i);
System.out.println(ch);
System.out.println(flag);
System.out.println(msg);
//4.关闭
is.close();
}
序列化流 Object
使用
/*
Object流|对象流|引用数据类型流
字节流的功能流
ObjectInputStream 反序列化输入流
新增方法 Object readObject() 从ObjectInputStream中读取一个对象。 等等
ObjectOutputStream 序列化输出流
新增方法 void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。
序列化: 将对象数据转为可存储或者可传输的状态的过程
不是所有类型的数据都能序列化 java.io.Serializable
如果写出的对象类型没有实现序列化接口,会遇到运行时异常java.io.NotSerializableException
序列化与反序列化顺序保持一致
不是所有的属性都需要序列化 transient
static的成员不会被序列化
如果父类实现类序列化接口,子类所有内容都可以进行序列化
子类实现了序列化接口,只能序列化子类独有的内容
序列号: 当实现了序列化的类型默认存在一个序列号
当类中的成员发生改变,序列号默认会重新生成
作用: 使用序列号可以实现检查前后版本不一致问题
解决不同版本的兼容问题: 手动设置序列号
通过快捷键生成序列号:
1.类型必须实现了序列化接口
2.Setting中进行配置
3.双击类名alt+enter,自动生成序列号【如果快捷键无效,请如下图设置】
*/
public static void testRead(String path) throws IOException, ClassNotFoundException {
//1.构建输入流
ObjectInputStream is = new ObjectInputStream(new FileInputStream(path));
//2.读入数据
Person p = (Person) is.readObject();
int[] arr = (int[]) is.readObject();
//3.处理数据
System.out.println(p);
System.out.println(Arrays.toString(arr));
//4.关闭
is.close();
}
//序列化输出
public static void testWrite(String path) throws IOException {
//1.定义输出流
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path));
//2.准备数据
Person p = new Person("张三",18);
p.a = 10;
int[] arr = {1,2,3,4,5};
//3.写出
os.writeObject(p);
os.writeObject(arr);
//4.刷出
os.flush();
//5.关闭
os.close();
p.a = 100;
}
class Person implements Serializable {
//设置序列化ID,序列化后,类中内容发生改变后,可以继续反序列化
private static final long serialVersionUID = -1108656603703788489L;
private String name;
//transient 表示此字段不会被序列化
private transient int age;
//Static静态内容也不会被序列化
public static int a ;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
",a="+a+
'}';
}
}