DataOutputStream 和 ObjectOutputStream的共同点是:

1、写出后读取

2、读取顺序和写出一致

数据流操作:

// 写入
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(baos));
dos.writeUTF("编码辛酸泪");
dos.writeInt(18);
dos.writeBoolean(false);
dos.writeChar('a');
dos.flush();
byte[] datas = baos.toByteArray();
System.out.println(datas.length); // 写出
ByteArrayInputStream bais = new ByteArrayInputStream(datas);
DataInputStream dis = new DataInputStream(new BufferedInputStream(bais));
String msg = dis.readUTF();
int age = dis.readInt();
boolean flag = dis.readBoolean();
char ch = dis.readChar();
System.out.println(ch);

对象流操作:

对象的写入写入又叫序列化和方序列化,需要注意的是,并不是所有的对象都可以序列化,如果要对对象进行序列化,需要实现 Serializable 接口,如果不想让对象中某个属性序列化,可以使用 transient 关键字标识

比如我们自己定义一个类:

class Employee implements Serializable{
private transient String name;
private double salary;
public Employee() {
}
public Employee(String name, double salary) {
super();
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
} }

序列化到字节数组:

// 写出--> 序列化
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(baos));
// 操作数据类型
oos.writeUTF("编码辛酸泪");
oos.writeInt(18);
oos.writeBoolean(false);
oos.writeChar('a'); // 操作对象
oos.writeObject("谁解其中味");
oos.writeObject(new Date());
oos.writeObject(new Employee("马云", 400));
oos.flush();
byte[] datas = baos.toByteArray();
oos.close(); // 读取--> 反序列化
ByteArrayInputStream bais = new ByteArrayInputStream(datas);
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(bais)); String msg = ois.readUTF();
int age = ois.readInt();
boolean flag = ois.readBoolean();
char ch = ois.readChar();
System.out.println(age); // 对象还原
Object str = ois.readObject();
Object date = ois.readObject();
Object emp = ois.readObject();
if(str instanceof String) {
String strObj = (String) str;
System.out.println(strObj);
} if(date instanceof Date) {
Date dateObj = (Date) date;
System.out.println(dateObj);
} if(emp instanceof Employee) {
Employee empObj = (Employee) emp;
System.out.println(empObj.getName() + "-->" + empObj.getSalary());
} ois.close();
}

序列化到文件:

// 写出--> 序列化
ObjectOutputStream oos = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream("obj.ser")));
// 操作数据类型
oos.writeUTF("编码辛酸泪");
oos.writeInt(18);
oos.writeBoolean(false);
oos.writeChar('a'); // 操作对象
oos.writeObject("谁解其中味");
oos.writeObject(new Date());
oos.writeObject(new Employee("马云", 400));
oos.flush();
oos.close(); // 读取--> 反序列化
ObjectInputStream ois = new ObjectInputStream(
new BufferedInputStream(new FileInputStream("obj.ser"))); String msg = ois.readUTF();
int age = ois.readInt();
boolean flag = ois.readBoolean();
char ch = ois.readChar();
System.out.println(age); // 对象还原
Object str = ois.readObject();
Object date = ois.readObject();
Object emp = ois.readObject();
if(str instanceof String) {
String strObj = (String) str;
System.out.println(strObj);
} if(date instanceof Date) {
Date dateObj = (Date) date;
System.out.println(dateObj);
} if(emp instanceof Employee) {
Employee empObj = (Employee) emp;
System.out.println(empObj.getName() + "-->" + empObj.getSalary());
} ois.close();

Java IO 流 -- 数据流和对象流 DataOutputStream ObjectOutputStream的更多相关文章

  1. JAVA基础复习与总结<八> 缓冲流_数据流_对象流_IO总结

    缓冲流.数据流以及对象流 一.缓冲流 缓冲流的概念:在读写的时候,对于单字节的读取会造成硬盘的频繁读写,增加访问次数,降低了读取文件的效率.而引入缓冲流之后,就可以将多个字节写入缓冲区,在缓冲区积累之 ...

  2. Java IO(十一) DataInputStream 和 DataOutputStream

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

  3. 系统学习 Java IO (十二)----数据流和对象流

    目录:系统学习 Java IO---- 目录,概览 DataInputStream/DataOutputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型. 要想使用 ...

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

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

  5. 一、I/O操作(缓存流,数据流,对象流)

    一.缓存流 以介质是硬盘为例子说明,字节流和字符流的缺点: 每次读写的时候,都会访问硬盘,如果读写频率比较高的时候,性能不佳.为了解决问题,采用缓存流. 缓存流在读取的时候,会一次性读较多的数据到缓存 ...

  6. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  7. Java IO详解(二)------流的分类

    一.根据流向分为输入流和输出流: 注意输入流和输出流是相对于程序而言的. 输出:把程序(内存)中的内容输出到磁盘.光盘等存储设备中      输入:读取外部数据(磁盘.光盘等存储设备的数据)到程序(内 ...

  8. Java IO(五)——字符流进阶及BufferedWriter、BufferedReader

    一.字符流和字节流的区别 拿一下上一篇文章的例子: package com.demo.io; import java.io.File; import java.io.FileReader; impor ...

  9. Java IO(四)——字符流

    一.字符流 字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为一个Unicode字符占用2 ...

随机推荐

  1. 超图iserver登录密码忘记,重置密码

    如果大家在用超图iserver发布服务的过程中将登录密码忘记,大家不要慌,iserver自带的有密码重置功能. 1.首先在登录过程中提示密码错误,具体内容如下图所示: 2.首先先停止iserver服务 ...

  2. Ubuntu系统下命令行查看自己已安装的桌面环境问题

    原因:有时我们进行远程连接时需要知道我们的Ubuntu系统已安装的桌面环境,这时我们可以使用[dpkg]命令. [dpkg]:dpkg命令是Debian Linux系统用来安装.创建和管理软件包的实用 ...

  3. 物体的三维识别与6D位姿估计:PPF系列论文介绍(三)

    作者:仲夏夜之星 Date:2020-04-08 来源:物体的三维识别与6D位姿估计:PPF系列论文介绍(三) 文章“A Method for 6D Pose Estimation of Free-F ...

  4. 面试常问的 Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  5. JDBC获取连接抛出java.sql.SQLException: The server time zone...

    今天尝试数据库,代码确实没问题就是给了给这个东西 java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecogniz ...

  6. stm32:实现呼吸灯

    1.main.c #include "sys.h" #include "delay.h" #include "key.h" #define ...

  7. 为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。 改进查找流程

    原文链接:https://www.cnblogs.com/qidian10/p/6028784.html  为防止原作者删除,留作解决方法备份 ---------------------------- ...

  8. 在 Array.filter 中正确使用 Async

    本文译自How to use async functions with Array.filter in Javascript - Tamás Sallai. 0. 如何仅保留满足异步条件的元素 在第一 ...

  9. VUE_shop(第十天)项目的打包优化

    项目的打包优化 1.添加页面的加载效果 1.首先安装运行依赖nprocess,在main.js文件中的axios拦截器拦截请求的时候调用Npeocees.start. 在拦截响应的时候调用nproce ...

  10. linux中忘记了mysql的root用户的密码怎么办?

    1.vim /etc/my.cnf skip-grant-tables  #取消此行的注释 2.重启mysql systemctl restart mysqld 3.mysql 登陆mysql mys ...