对象流

  对象的本质是用来组织和存储数据的,对象本身也是数据。那么,能不能将对象存储到硬盘上的文件中呢?能不能将对象通过网络传输到另一个电脑呢?我们可以通过序列化和反序列化实现。

java对象的序列化和反序列化

	当两个进程远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会议二进制的序列的形式在网络中传送。比如,我们可以通过http协议发送字符串信息;我们也可以在网络上直接发送java对象。发送方需要把这个java对象转换为字节序列化,才能在网络上传送;接收方则需要把字节序列恢复为java对象才能正常读取。
把java对象转换为字节序列的过程为**对象的序列化**。字节序列话恢复为java对象的过程称为**对象的反序列化**。

** 对象序列化的作用有如下两种:**

  • 持久化 把对象的字节序列化永久的保存在硬盘上,通常存放在一个文件中
  • 网络通信 在网络上传送对象的字节序列。比如:服务器之间的数据通信/对象传递。

序列化涉及到的类和接口

	ObjectOutputStream代表对象输出流,它的writeObject(Object object)方法可对参数指定的obj对象进行序列化,把得到的字节序列化写到一个目标输出流中。
ObjectInputStream 代表对象输入流,他的readObject()方法从一个源输入流中读取字节序列,再把他们反序列话一个对象,并将其返回。
只有实现了Serializable接口的类的对昂才能被序列化。Serializable接口是一个空接口,只起到标记作用

对象流_写出基本的数据类型

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream; /**
* @author Mxhlin
* @Email fuhua277@163.com
* @Date 2022/08/29/20:32
* @Version
* @Description 对象流_写出基本的数据类型
*/
public class ObjectOutputStreamBasicTypeDemo { public static void main(String[] args) {
ObjectOutputStreamBasicTypeDemo oosbt = new ObjectOutputStreamBasicTypeDemo();
oosbt.objectOutputStream("D:\\IOTest\\ma.txt");
} /**
* @Description: 写出基本的数据类型
* @Param: [str]
* @return: void
* @Author: Mxhlin
* @Date: 2022/8/29
*/
public void objectOutputStream(String str){
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(str)));
oos.writeInt(12);
oos.writeChar('a');
oos.writeBoolean(false);
oos.writeDouble(12.0);
oos.writeUTF("你好啊");// String 类型
oos.flush();
}catch (Exception e){
e.fillInStackTrace();
}finally {
try {
if (oos != null){
oos.close();
}
}catch (Exception e){
e.fillInStackTrace();
}
}
}
}

运行结果

对象流_读出基本的数据类型

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream; /**
* @author Mxhlin
* @Email fuhua277@163.com
* @Date 2022/08/29/20:47
* @Version
* @Description 对象流_读取基本的数据类型
*/
public class ObjectInputSteamBasicTypeDemo { public static void main(String[] args) {
ObjectInputSteamBasicTypeDemo oisbtd = new ObjectInputSteamBasicTypeDemo();
oisbtd.objectInputStream("D:\\IOTest\\ma.txt");
} /**
* @Description: 读取基本的数据类型
* @Param: [ste]
* @return: void
* @Author: Mxhlin
* @Date: 2022/8/29
*/
public void objectInputStream(String ste){
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(ste)));
System.out.println("Int: "+ois.readInt());
System.out.println("Char: "+ois.readChar());
System.out.println("Boolean: "+ois.readBoolean());
System.out.println("Double: "+ois.readDouble());
System.out.println("String: "+ois.readUTF());
}catch (Exception e){
e.fillInStackTrace();
}finally {
try {
if (ois != null){
ois.close();
}
}catch (Exception e){
e.fillInStackTrace();
}
}
}
}

对象流_将对象序列化到文件

import java.io.FileOutputStream;
import java.io.ObjectOutputStream; /**
* @author Mxhlin
* @Email fuhua277@163.com
* @Date 2022/08/29/21:22
* @Version
* @Description 对象流_将对象序列化到文件
*/
public class ObjectOutputStreamObjectDemo { public static void main(String[] args) {
ObjectOutputStreamObjectDemo oosod = new ObjectOutputStreamObjectDemo();
oosod.objectOutputStream("D:\\IOTest\\木木.txt");
} /**
* @Description: 将对象序列化到文件
* @Param: [str]
* @return: void
* @Author: Mxhlin
* @Date: 2022/8/29
*/
public void objectOutputStream(String str){
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(str));
User user = new User(1,"木木","18");
oos.writeObject(user);
oos.flush();
}catch (Exception e){
e.fillInStackTrace();
}finally {
try {
if (oos != null){
oos.close();
}
}catch (Exception e){
e.fillInStackTrace();
}
}
}
}

运行结果

对象流_将对象反序列化内存

import java.io.FileInputStream;
import java.io.ObjectInputStream; /**
* @author Mxhlin
* @Email fuhua277@163.com
* @Date 2022/08/29/21:38
* @Version
* @Description 对象流_将对象反序列化内存
*/
public class ObjectInputStreamObjectTpeyDemo { public static void main(String[] args) {
ObjectInputStreamObjectTpeyDemo ooo = new ObjectInputStreamObjectTpeyDemo();
ooo.ObjectInputStream("D:\\IOTest\\木木.txt");
} /**
* @Description: 将对象反序列化内存
* @Param: [str]
* @return: void
* @Author: Mxhlin
* @Date: 2022/8/29
*/
public void ObjectInputStream(String str){
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(str));
User user = (User)ois.readObject();
System.out.println(user.getUserId());
System.out.println(user.getUserName());
System.out.println(user.getUserAge());
}catch (Exception e){
e.fillInStackTrace();
}finally {
try {
if (ois != null){
ois.close();
}
}catch (Exception e){
e.fillInStackTrace();
}
}
}
}

运行结果

IO_对象流的更多相关文章

  1. [源码]ObjectIOStream 对象流 ByteArrayIOStream 数组流 内存流 ZipOutputStream 压缩流

    1.对象流 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File ...

  2. Java IO7:管道流、对象流

    前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...

  3. Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)

    一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...

  4. Java IO5:管道流、对象流

    前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...

  5. java --对象流与对象的序列化

    对象流 ObjectInputStream ObjectOutputStream类分别是InputStream和OutputStream的子类,对象输出流使用writeObject(Object ob ...

  6. Java IO流之对象流

    对象流 1.1对象流简介 1.2对象流分类 输入流字节流处理流:ObjectInputStream,将序列化以后的字节存储到本地文件 输出流字节流处理流:ObjectOutputStream 1.3序 ...

  7. Java对象流的使用

    为了让对象持久化(把对象存储到本地),可以使用java的对象流处理对象,把对象的内容写到本地存储的文件中,也可以从本地文件中读取出来.也就是常说的序列化和反序列化 主要用到了ObjectInputSt ...

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

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

  9. Java之IO流进阶篇:内存流,打印流,对象流

    Java中的IO流,即为输入输出流.所谓输入输出流,都是相对于程序而言,程序就是这个参照物.一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputS ...

随机推荐

  1. UiPath条件判断活动If的介绍和使用

    if的介绍 if语句是指编程语言(包括c语言.C#.Python.Java.汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一. if在UiPath中的使用 ...

  2. 【Java面试】什么是 ISR,为什么需要引入 ISR

    Hi,大家好,我是Mic. 一个工作5年的粉丝,在简历上写精通Kafka. 结果在面试的时候直接打脸. 面试官问他:"什么是ISR,为什么需要设计ISR" 然后他一脸懵逼的看着面试 ...

  3. Tapdata 与星环 KunDB 完成产品兼容互认证

      近日, Tapdata 实时数据即服务平台(Tapdata Real Time DaaS)与星环 KunDB 完成产品兼容互认证.经深圳钛铂数据有限公司和星环信息科技(上海)股份有限公司共同严格测 ...

  4. 迭代阈值收缩算法ISTA,背后的思想与具体推到过程

  5. 基于MIndSpore框架的道路场景语义分割方法研究

    基于MIndSpore框架的道路场景语义分割方法研究 概述 本文以华为最新国产深度学习框架Mindspore为基础,将城市道路下的实况图片解析作为任务背景,以复杂城市道路进行高精度的语义分割为任务目标 ...

  6. maven配置的一个问题

    资源导出问题 如果想和dao接口放在一个包下可以做如下配置,但是如果不放在dao接口下,那就会报错,至于为什么,那就得好好学学maven了,因为下面是yaml的,所以需要添加yaml,不然他扫描不到 ...

  7. 数据结构(C语言版)严蔚敏->排序

    @ 目录 1. 插入排序 1.1 直接插入排序 1.2 折半插入排序 1.3 希尔排序(Shell Sort) 2.交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 简单选择排序 ...

  8. Linux系列之进程管理

    前言 进程是正在运行的程序,Linux系统通常有数百个进程同时运行.本文就来介绍下Linux是如何进行进程管理的. 我们可以看到: 查看进程(Viewing processes) 查找进程(Findi ...

  9. Vue 内置指令 && 自定义指令

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...

  10. 选择结构——if控制语句单、双、多分支结构

    1.if控制语句 概念: if控制语句共有3种不同形式,分别是单分支结构.双分支结构和多分支结构. (1)使用 if 语句实现单分支处理 语法格式: if(表达式){ 语句 } 流程图: 执行步骤: ...