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

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. Java-package import关键字

    package包关键字,在java中,有包的概念,主要是用来归类 分类作用: 便于项目的开发和维护: 通过分包,可以很清晰的来管理类: 上述 一个类Animal: 在开头有个 package com. ...

  2. [转]Jenkins HTML报告样式无法显示问题解决

    原文地址: https://vwin.github.io/2018/10/11/Jenkins-HTML%E6%8A%A5%E5%91%8A%E6%A0%B7%E5%BC%8F%E6%97%A0%E6 ...

  3. Spring中两种引入配置文件方式

    用过Spring的人都知道,我们一般把数据库的配置.日志的配置或者其他的通用配置放在单独的配置文件中,在和Spring整合时,一般通过以下两种方法引入: <context:property-pl ...

  4. curl的一些常用命令

    在学习nodejs中get到了一项新的技能crul curl 可以给在命令行上面给node服务器发送一些信息,然后得到服务器返回而响应信息,在命令行中打印出来. 下面是我整理的一些常用的命令:

  5. Python笔记(十二)_文件

    文件的打开模式 'r':以只读的方式打开文件(默认) 'w':以写入的方式打开文件,会覆盖已存在的文件 'x':用写入的方式打开文件,如果文件已存在,会抛出异常 'a':用写入的方式打开文件,如果文件 ...

  6. ELK+Filebeat (1)

    1 Filebeat介绍 Filebeat是Beat成员之一,基于Go语言,无任何依赖,并且比logstash更加轻量,非常适合安装在生产机器上,不会带来过高的资源占用,轻量意味着简单,所以Fileb ...

  7. 【报错】An error happened during template parsing (template: "class path resource [templates/hello1.html]")

    页面显示: Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing t ...

  8. Interface-接口的实现与注意事项

    package cn.learn.Interface; public interface MyInterfaceA { public abstract void methodA(); public a ...

  9. JavaScript实现的发布/订阅(Pub/Sub)模式

    JavaScript实现的发布/订阅(Pub/Sub)模式 时间 2016-05-02 18:47:58  GiantMing's blog 原文  http://giantming.net/java ...

  10. 移动端web整理 移动端问题总结,移动web遇到的那些坑

    meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 忽略将页面中的数字识别为电话号码 忽略Android平台中对邮箱地址的识别 当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对i ...