IO流
ObjectOutputStream/ObjectInputStream:
对象的输入输出流
作用:读写对象信息。写到文件上将对象信息持久化
对象输出流:ObjectOutputStream
对象输入流:ObjectInputStream
注意:
如果对象需要被写出到文件上,则对象所属的类必须要实现Serializable接口。Serializable接口没有方法,只是一个标识接口
对象的反序列化创建对象时不会调用构造方法
serialVersionUID用于记录class文件的版本信息,根据类名、成员名、包名、工程名算出来的
使用ObjectInputStream反序列化时,ObjectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID对比,如果两个id不一致,则反序列化失败
如果序列化与反序列化时有可能修改类的成员,则最好在一开始就给这个类指定一个serialVersionUID,这样序列化与反序列化时,jvm就不会自己计算serialVersionUID了。
如果一个对象的某个数据不想被序列化到硬盘上,可以使用transient关键字修饰
如果一个类维护了另外一个类的引用,则这个另外的类也要实现Serializable接口
package test;
import java.io.*;
class Address implements Serializable{
private static final long serialVersionUID = 1L;
String country;
String city;
public Address(String country,String city){
this.country=country;
this.city=city;
}
}
class User implements Serializable{
// 指定serialVersionUID
private static final long serialVersionUID = 1L;
String userName;
String password;
transient int age;//不会被序列化到硬盘上
Address address;
public User(String userName,String password,int age,Address address){
this.userName=userName;
this.password=password;
this.age=age;
this.address=address;
}
public String toString(){
return "用户名:"+this.userName+" 密码:"+this.password+" 年龄:"+this.age+" 地址:"+this.address.city;
}
}
public class Demo4 {
public static void main(String[] args) throws IOException, ClassNotFoundException{
writeObj();
readObj();
}
//定义方法把对象的信息写到硬盘上------称为对象的序列化
public static void writeObj() throws IOException{
//把user对象的信息持久化
User user=new User("admin","123",21,new Address("中国","北京"));
//找到目标文件
File file=new File("F:\\test\\obj.txt");
//建立数据输出流对象
FileOutputStream fileOutputStream=new FileOutputStream(file);
//建立对象的输出流对象
ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);
//把对象写出
objectOutputStream.writeObject(user);
//关闭资源
objectOutputStream.close();
}
//把文件中的对象信息读取出来-----对象的反序列化
public static void readObj() throws IOException, ClassNotFoundException{
//找到目标文件
File file=new File("F:\\test\\obj.txt");
//建立数据的输入通道
FileInputStream fileInputStream=new FileInputStream(file);
//建立对象的输入流对象
ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
//读取对象信息
User user=(User) objectInputStream.readObject();
System.out.println(user);
//关闭资源
objectInputStream.close();
}
}
FileInputStream和FileOutputStream:
FileInputStream 用于读取本地文件中的字节数据,继承自InputStream类
构造方法摘要
FileInputStream(File file)
通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(FileDescriptor fdObj)
通过使用文件描述符 fdObj 创建一个FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。
FileInputStream(String name)
通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名 name 指定。
读取文件的两种方法:
read():一个一个字节的读
read(byte[] buf):先把字节存入到缓冲区字节数组中,一下读一个数组(常用)
上一篇: app开发用php还是java