前面的 DataInputStream,DataOutputStream 分别实现了 java.io.DataOutput/DataInput 接口,这里 ObjectOutput/ObjectInput 两个接口在上面的两个接口之上
还分别添加了方法:writeObject / readObject,而 ObjectOutputStream /ObjectInputStream 分别实现了上面的两个接口,还继承了 java.io.OutputStream/InputStream
java.io.Externalizable 继承了 java.io.Serializable ,用于在对象序列化过程中提供增强的功能
④对象序列化过程中的数据保护
标记性接口Serializable (这个接口中没有任何的抽象方法,标记性接口一般是用于作为一种过滤器)
在对象序列化过程中,其所属类的static属性和方法代码不会被序列化处理。
对于个别不希望被序列化的非static属性,可以在属性声明时使用transient关键字进行标明。
用法举例:
例:
Person.java
package v512.chap14; import java.io.Serializable; public class Person implements Serializable{ private static int resource = 100;//static属性,不会序列化 private String name ;//会序列化 private transient String password;//transient 不会序列化 public Person(String name,String password){ this.name = name; this.password = password; } public static void setResource(int resource){ Person.resource = resource; } public static int getResource(){ return resource; } public String toString(){ return "name:" + name + "tpassword:" + password; } }
WriteObject.java
package v512.chap14; import java.io.*; public class WriteObject { public static void main(String[] args){ try{ Person.setResource(2345); FileOutputStream fos = new FileOutputStream("D:\\person.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); Person p1 = new Person("Scott","tiger"); Person p2 = new Person("Spring","field"); System.out.println(Person.getResource()); // 2345 oos.writeObject(p1); oos.writeObject(p2); oos.close(); }catch(IOException e){ e.printStackTrace(); } } }
ReadObject.java
package v512.chap14; import java.io.*; public class ReadObject{ public static void main(String[] args){ try{ //Person.setResource(5555); FileInputStream fis = new FileInputStream("D:\\person.txt"); ObjectInputStream ois = new ObjectInputStream(fis); Person e1 = (Person)ois.readObject(); Person e2 = (Person)ois.readObject(); System.out.println(e1); System.out.println(e2); System.out.println(Person.getResource()); System.out.println(e1.getResource()); ois.close(); }catch(IOException e){ e.printStackTrace(); }catch(ClassNotFoundException e){ e.printStackTrace(); } } }
控制台输出:
name:Scott password:null
name:Spring password:null
100
100
密码没有,说明password没有序列化,而且resource还是100,不是2345,说明static属性也是不会序列化的
而且static属性的值不会因为序列化时resource的值改变而改变
8. NIO (暂时没有仔细看)
什么是NIO?
NIO基础:以下三者是NIO的核心
缓冲区(Buffer)
通道(Channel):和操作系统底层的双向输入输出管道关联
字符集转换(Charset)
高级NIO技术
子缓冲区和数据共享
只读缓冲区
内存映射文件
文件锁定