看这两个类的名字就不难猜想出它们的类关系图。java
DataOutputStream: 主要是一些writeXxx()操做,写出, 至关于序列化ide
DataInputStream: 主要是一些readXxx()操做,写入, 至关于反序列化this
通常状况下,二者会成对出现。 在使用过程当中要特别注意, 一个writeXxx() 对应着一个readXxx(), 千万不要用readInt()去对应writeBoolean().spa
说白了,就是序列化与反序列化要匹配。code
下面举个例子,将Student对象的属性序列化后保存到文件中,而后反序列还原,示例代码以下:对象
public class Student { private int id; private String name; private long age; private boolean gender; public Student(int id, String name, long age, boolean gender) { this.id = id; this.name = name; this.age = age; this.gender = gender; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getAge() { return age; } public void setAge(long age) { this.age = age; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", gender=" + gender + '}'; } }
@Test public void testDataStream() throws IOException { // 建立一个Student对象 Student student = new Student(1, "郑钦锋", 100, true); // 建立一个DataOutputStream对象 OutputStream outputStream = new FileOutputStream("E:\\360downloads\\wpcache\\srvsetwp\\student.txt"); DataOutputStream dataOutputStream = new DataOutputStream(outputStream); // 对java的8种基本数据类型进行write操做,其实就至关于序列化操做 dataOutputStream.writeInt(student.getId()); dataOutputStream.writeUTF(student.getName()); dataOutputStream.writeLong(student.getAge()); dataOutputStream.writeBoolean(student.isGender()); // 关流 dataOutputStream.close(); // 读取文件,进行反序列化操做 FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\student.txt"); DataInputStream dataInputStream = new DataInputStream(inputStream); int id = dataInputStream.readInt(); String name = dataInputStream.readUTF(); long age = dataInputStream.readLong(); boolean gender = dataInputStream.readBoolean(); // 还原这个student对象 Student retStudent = new Student(id, name, age, gender); System.out.println(retStudent); // Student{id=1, name='郑钦锋', age=100, gender=true} dataInputStream.close(); } }
若是序列化与反序列化不匹配,就是个悲剧,请看下面的示例:blog
@Test public void testDataStream() throws IOException { // 建立一个Student对象 Student student = new Student(1, "郑钦锋", 100, true); // 建立一个DataOutputStream对象 OutputStream outputStream = new FileOutputStream("E:\\360downloads\\wpcache\\srvsetwp\\student.txt"); DataOutputStream dataOutputStream = new DataOutputStream(outputStream); // 对java的8种基本数据类型进行write操做,其实就至关于序列化操做 dataOutputStream.writeLong(student.getAge()); dataOutputStream.writeBoolean(student.isGender()); dataOutputStream.writeUTF(student.getName()); dataOutputStream.writeInt(student.getId()); // 关流 dataOutputStream.close(); // 读取文件,进行反序列化操做 FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\student.txt"); DataInputStream dataInputStream = new DataInputStream(inputStream); int id = dataInputStream.readInt(); String name = dataInputStream.readUTF(); long age = dataInputStream.readLong(); boolean gender = dataInputStream.readBoolean(); // 还原这个student对象 Student retStudent = new Student(id, name, age, gender); System.out.println(retStudent); // Student{id=0, name='', age=28148597348991889, gender=true} dataInputStream.close(); }
因此,write序列化的顺序是: int(id) ---> string(name) ---> long(age)----> boolean(gender);get
read反序列化的顺序必定要是: int(id) ---> string(name) ---> long(age)----> boolean(gender);input