看这两个类的名字就不难猜测出它们的类关系图。

DataOutputStream: 主要是一些writeXxx()操作,写出, 相当于序列化

DataInputStream: 主要是一些readXxx()操作,写入, 相当于反序列化

一般情况下,两者会成对出现。 在使用过程中要特别注意, 一个writeXxx() 对应着一个readXxx(), 千万不要用readInt()去对应writeBoolean().

说白了,就是序列化与反序列化要匹配。

下面举个例子,将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();
}
}

如果序列化与反序列化不匹配,就是个悲剧,请看下面的示例:

  @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);

read反序列化的顺序一定要是: int(id) ---> string(name) ---> long(age)----> boolean(gender);

数据流:DataOutputStream与DataInputStream的使用的更多相关文章

  1. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  2. Java IO操作——数据操作流DataOutputStream和DataInputStream的使用

    学习目标  掌握DataOutputStream和DataInputStream的作用 可以使用DataOutputStream和DataInputStream写入和读入数据 数据操作流 在io包中, ...

  3. JAVA IO操作:数据操作流:DataOutputStream和DataInputStream

    掌握DataOutputStream和DataInputStream的作用. 可以使用DataOutputStream和DataInputStream写入和读取数据. 在IO包中提供了两个与平台无关的 ...

  4. [Java] 读写字节数据,过滤流DataOutputStream和DataInputStream

    package test.stream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io ...

  5. DataOutputStream and DataInputStream

    1.在io包中,提供了两个与平台无关的数据操作流 数据输出流(DataOutputStream) 数据输入流(DataInputStream) 2.通常数据输出流会按照一定的格式将数据输出,再通过数据 ...

  6. 数据操作流DataOutputStream、DataInputStream类

    [例子1] import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import ...

  7. Java IO(十一) DataInputStream 和 DataOutputStream

    Java IO(十一) DataInputStream 和 DataOutputStream 一.介绍 DataInputStream 和 DataOutputStream 是数据字节流,分别继承自 ...

  8. Java基础:浅谈数据输入流/数据输出流《DataInputstream类与DataOutputstream类》

     一.理论概述 数据输入/输出流(DataInputStream类与DataOutputStream类) 允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型. 说白了就是,当读取一个 ...

  9. Java IO学习笔记(三)转换流、数据流、字节数组流

    转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和 ...

随机推荐

  1. HDU4089 Activation(概率DP+处理环迭代式子)

    题意:有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有一下情况: 1.激活失败,留在队列中等待下一次激活(概率为p1) 2.失去连接,出队列,然后排在队列的最后(概 ...

  2. POJ 1753 Flip Game (状压+暴力)

    题目链接:http://poj.org/problem?id=1753 题意: 给你一个4*4的棋盘,上面有两种颜色的棋子(一种黑色,一种白色),你一次可以选择一个棋子翻转它(黑色变成白色,同理反之) ...

  3. Chrome开发小技巧--浏览器控制台现写并运行js代码--snippets

    想简单等运行一段js代码,以前可能会新建一个html 里面包含script标签,或者引入一个js,然后chrome浏览器打开.这样很麻烦. 想再console控制台写,也不方便,换行处理麻烦. 基于在 ...

  4. Linux_Bash脚本基础

    目录 目录 Bash使用基础 if 语句 运算符 逻辑表达式 不将执行指令的结果显示出来 echo 语句 从Bash接受输入参数 Case语句 循环 for 语句 While语句 内置变量和函数 AW ...

  5. 让dcef3支持mp3和h.264 mp4解码播放

    嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件.CE ...

  6. hbase报Dead Region Servers

    问题描述: 16010端口启动成功,16020未启动. hbase-root-regionserver-hbase2.log日志: 2019-08-14 16:45:10,552 WARN [Thre ...

  7. 【PP系列】SAP 取消报工后修改日期

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[PP系列]SAP 取消报工后修改日期   前言 ...

  8. Waiter.js

    var Waiter = function() {     var dfd = [],         doneArr = [],         failArr = [],         slic ...

  9. POJ 2528 Mayor's posters(线段树,区间覆盖,单点查询)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45703   Accepted: 13239 ...

  10. 2019 Multi-University Training Contest 1 - 1011 - Function - 数论

    http://acm.hdu.edu.cn/showproblem.php?pid=6588 新学到了一个求n以内与m的gcd的和的快速求法.也就是下面的S1. ①求: $ \sum\limits_{ ...