数据流:DataOutputStream与DataInputStream的使用
看这两个类的名字就不难猜测出它们的类关系图。
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的使用的更多相关文章
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java IO操作——数据操作流DataOutputStream和DataInputStream的使用
学习目标 掌握DataOutputStream和DataInputStream的作用 可以使用DataOutputStream和DataInputStream写入和读入数据 数据操作流 在io包中, ...
- JAVA IO操作:数据操作流:DataOutputStream和DataInputStream
掌握DataOutputStream和DataInputStream的作用. 可以使用DataOutputStream和DataInputStream写入和读取数据. 在IO包中提供了两个与平台无关的 ...
- [Java] 读写字节数据,过滤流DataOutputStream和DataInputStream
package test.stream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io ...
- DataOutputStream and DataInputStream
1.在io包中,提供了两个与平台无关的数据操作流 数据输出流(DataOutputStream) 数据输入流(DataInputStream) 2.通常数据输出流会按照一定的格式将数据输出,再通过数据 ...
- 数据操作流DataOutputStream、DataInputStream类
[例子1] import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import ...
- Java IO(十一) DataInputStream 和 DataOutputStream
Java IO(十一) DataInputStream 和 DataOutputStream 一.介绍 DataInputStream 和 DataOutputStream 是数据字节流,分别继承自 ...
- Java基础:浅谈数据输入流/数据输出流《DataInputstream类与DataOutputstream类》
一.理论概述 数据输入/输出流(DataInputStream类与DataOutputStream类) 允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型. 说白了就是,当读取一个 ...
- Java IO学习笔记(三)转换流、数据流、字节数组流
转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和 ...
随机推荐
- HDU4089 Activation(概率DP+处理环迭代式子)
题意:有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有一下情况: 1.激活失败,留在队列中等待下一次激活(概率为p1) 2.失去连接,出队列,然后排在队列的最后(概 ...
- POJ 1753 Flip Game (状压+暴力)
题目链接:http://poj.org/problem?id=1753 题意: 给你一个4*4的棋盘,上面有两种颜色的棋子(一种黑色,一种白色),你一次可以选择一个棋子翻转它(黑色变成白色,同理反之) ...
- Chrome开发小技巧--浏览器控制台现写并运行js代码--snippets
想简单等运行一段js代码,以前可能会新建一个html 里面包含script标签,或者引入一个js,然后chrome浏览器打开.这样很麻烦. 想再console控制台写,也不方便,换行处理麻烦. 基于在 ...
- Linux_Bash脚本基础
目录 目录 Bash使用基础 if 语句 运算符 逻辑表达式 不将执行指令的结果显示出来 echo 语句 从Bash接受输入参数 Case语句 循环 for 语句 While语句 内置变量和函数 AW ...
- 让dcef3支持mp3和h.264 mp4解码播放
嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件.CE ...
- hbase报Dead Region Servers
问题描述: 16010端口启动成功,16020未启动. hbase-root-regionserver-hbase2.log日志: 2019-08-14 16:45:10,552 WARN [Thre ...
- 【PP系列】SAP 取消报工后修改日期
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[PP系列]SAP 取消报工后修改日期 前言 ...
- Waiter.js
var Waiter = function() { var dfd = [], doneArr = [], failArr = [], slic ...
- POJ 2528 Mayor's posters(线段树,区间覆盖,单点查询)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45703 Accepted: 13239 ...
- 2019 Multi-University Training Contest 1 - 1011 - Function - 数论
http://acm.hdu.edu.cn/showproblem.php?pid=6588 新学到了一个求n以内与m的gcd的和的快速求法.也就是下面的S1. ①求: $ \sum\limits_{ ...