数据流: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()和 ...
随机推荐
- (转)Hyper-v 安装CentOS 7 (其他虚拟机一样参考)
转:https://www.cnblogs.com/dunitian/p/4976077.html 平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunit ...
- p4593 [TJOI2018]教科书般的亵渎
分析 我们发现$Ans = \sum_i \sum_j (j-p_i)^{m+1}$ 因此直接套用622f的方法即可 代码 #include<bits/stdc++.h> using na ...
- java 为啥可打印date
打印一个对象的时候,会打印出它的toString方法的返回值,Date重写了toString方法.
- Mac定制终端:iTerm2 + zsh + powerline
原始界面: 配置后的界面: 安装iTerm2 可以直接去官网下载:https://www.iterm2.com/ 下载后直接安装即可 安装主题 所有主题:https://iterm2color ...
- jmeter之非GUI启动与执行脚本
启动jmeter的图形界面可以从dos窗口输命令启动:图形界面还是比较占资源的,这时候可以通过dos窗口来执行脚本,获取性能结果 目录 1.dos窗口启动jmeter图形界面 2.dos窗口执行脚本, ...
- 求 主板型号 945GME - ICH7M/U 支持的最大内存,以及内存型号 10
https://zhidao.baidu.com/question/400302290.html 求 主板型号 945GME - ICH7M/U 支持的最大内存,以及内存型号 10 主板型号 明基 J ...
- SmokeTest测试流程
没办法了,本来是表格,但是粘贴不过来 测试目的: 用于检测该版本在基本的应用场景下,基本的功能是否满足. 测试前提: 发货版本 示例:ATV9冒烟测试测试项解读 表格获取:Google ATV hel ...
- 机器学习实战笔记-5-Logistic回归
Logistic回归 优缺点 适用范围 优点:计算代价不高,易于理解和实现. 缺点:容易欠拟合,分类精度可能不高. 适用于:数值型和标称型数据. 仅用于二分类 原理: 每个特征都乘以一个回归系数> ...
- MapReduce(2): How does Mapper work
In the previous post, we've illustrated how Hadoop MapReduce prepares input for Mappers. Long story ...
- 让Debian以root登录
Debian默认不允许root登录,所以修改之. (1)让Debian以root登录 修改gdm3的登录pam文件 #vi /etc/pam.d/gdm3 将auth required pam_suc ...