数据流: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()和 ...
随机推荐
- Spring中两种引入配置文件方式
用过Spring的人都知道,我们一般把数据库的配置.日志的配置或者其他的通用配置放在单独的配置文件中,在和Spring整合时,一般通过以下两种方法引入: <context:property-pl ...
- [转载]Java中异常的捕获顺序(多个catch)
http://blog.sina.com.cn/s/blog_6b022bc60101cdbv.html [转载]Java中异常的捕获顺序(多个catch) (2012-11-05 09:47:28) ...
- python math 模块
数学模块 引入模块:import math 注意: 使用某个模块下的函数,必须先引入这个模块,否则无法正常使用. ceil() 向上取整操作 格式:math.ceil(数值) 返回值:整型 floor ...
- C#=> 栈模仿堆的操作
//原理,利用两个栈,互相作用,来模仿堆的效果,先进先出.. using System; using System.Collections.Generic; using System.Linq; us ...
- CCNA 之 二 OSI七层模型
OSI网际互联 OSI的概念 英文全称Open System Interconnect 开放系统互联参数模型,是由ISO国际标准化组织 定义的.它是个灵活的.稳健的和可互操作的模型,并不是协议,使用来 ...
- P4390 [BOI2007]Mokia 摩基亚
传送门 对于一个询问 $(xa,ya),(xb,yb)$,拆成 $4$ 个询问并容斥一下 具体就是把询问变成求小于等于 $xb,yb$ 的点数,减去小于等于 $xa-1,yb$ 和小于等于 $xb,y ...
- Linux grep常用命令
在一个文件中同时查找多个字符串: 并集语法: grep -e 'pattern1 -e 'pattern2 file 或集语法: 1.grep -E 'pattern1|pattern2' file ...
- NEO4J -模糊查询
模糊查询 match(emp) where emp.name =~'.*haha.*' return emp 现有节点创建关系 MATCH (cust:Customer),(cc:CreditCard ...
- idea 创建 SSM + maven Java Web 项目流程
idea 创建 SSM + maven Java Web 项目流程 一.idea 中选择File,New Project 新建项目 二.选择Maven,勾选上面的Create from archety ...
- ASE Alpha Sprint - backend scrum 7
本次scrum于2019.11.12在sky garden进行,持续30分钟. 参与人: Zhikai Chen, Jia Ning, Hao Wang 请假: Xin Kang, Lihao Ran ...