五、对象专属流
、
ObjectInputStream
ObjectOutputStream
把流的操作跟Java对象连接起来,主要用于对象的序列化和反序列化
(1)序列化和反序列化的定义:
- Java序列化就是指把Java对象转换为字节序列写到硬盘的过程
- Java反序列化就是指把字节序列恢复为Java对象从硬盘读取的过程。
(2)序列化最重要的作用:在传递和保存对象时保证对象的完整性和可传递性。对象转换为有序字节流,以 便在网络上传输或者保存在本地文件中。
反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)
ps:想要一次性序列化多个对象需使用集合,将对象添加到集合中,一个个序列化是不行的。
只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。
Serializable :序列化接口,是一个标志性接口,里面没有方法。
序列化版本号 :实现Serializable接口后,会生成序列化版本号,做标识作用,用以区分Java类。
如果进行序列化,此时生成一个序列化版本号,代码确定后不能进行后续的修改。因为反序列化会先编译,修改之后进行编译会生成新的序列化版本号,java虚拟机会认为这是一个全新的类。
所以建议自定义序列化版本号,将序列化版本号写死。
声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据
private transient String age;
1、ObjectOutputStream
/**
* 对象流:把流的操作跟Java对象连接起来
* 主要用于对象的序列化和反序列化
*/
public class IOTest08 {
public static void main(String[] args) {
try {
//创建序列化对象
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("userFile"));
User user1 = new User("柿","123");
User user2 = new User("子","123");
User user3 = new User("牛","123");
User user4 = new User("啊","123");
ArrayList<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
//序列化对象
objectOutputStream.writeObject(users);
objectOutputStream.flush();
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、ObjectInputStream
public class IOTest09 {
public static void main(String[] args) {
try {
//创建反序列化对象
ObjectInputStream userFile = new ObjectInputStream(new FileInputStream("userFile"));
ArrayList<User> o = (ArrayList<User>)userFile.readObject();
for (User user : o) {
System.out.println(user);
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
六、文件类(File类)
文件和目录路径名的抽象表示,即既可以表示文件也可以表示文件目录路径
https://blog.csdn.net/weixin_43683536/article/details/89498287
public class IOTest10 {
public static void main(String[] args) {
//创建file对象
File file = new File("io01.txt");
//判断是否是文件
System.out.println(file.isFile());
//判断是否是绝对路径
System.out.println(file.isAbsolute());
//获得文件的路径
System.out.println(file.getPath());
//获得文件的父级目录
System.out.println(file.getParent());
//创建文件的方法
//public boolean createNewFile();
File file1 = new File("E:\\Temp\\io03.java");
file1.createNewFile();
System.out.println(file1.isAbsolute());
System.out.println(file1.getParent());
System.out.println(file1.getParentFile());
//创建多级目录
File file2 = new File("E:/a/b/c");
boolean mkdirs = file2.mkdirs();
System.out.println(mkdirs);
//获取一个路径下的所有文件
File file3 = new File("E:\\Temp");
File[] files = file3.listFiles();
for (File file4 : files) {
System.out.println(file4.getAbsolutePath());
}
}
}
与文件相关的map集合:Properties
public class IOTest11 {
public static void main(String[] args) {
FileReader fileReader = null;
//创建一个输入流对象
try {
fileReader = new FileReader("io01.txt");
//之前学过的一个map集合
Properties properties = new Properties();
//将流加载进properties
properties.load(fileReader);
//根据key获取value
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println(username);
System.out.println(password);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}