五、对象专属流
、
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();//将流加载进propertiesproperties.load(fileReader);//根据key获取valueString 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();}}}}
