对象流

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

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. C4C中更方便的消息管理

  2. Educational Codeforces Round 129 (Rated for Div. 2) A-D

    Educational Codeforces Round 129 (Rated for Div. 2) A-D A 题目 https://codeforces.com/contest/1681/pro ...

  3. WPF双滑块控件以及强制捕获鼠标事件焦点

    效果 概述 最近有个小需求要用双滑块表示一个取值范围,于是就简单做了个用户控件,在此记录下. 使用矩形Rectangle表示范围,椭圆Ellipse表示滑块,使用Canvas控制滑块的左右移动. 椭圆 ...

  4. Whats On Tap | Tapdata Cloud 如何助力大型家居连锁商城推进数字化经营?

    Tapdata Cloud 的操作有多便捷,上手试一下就能充分了解了.--Tapdata Cloud 用户 | 报表实施 @某大型家居服务平台 一边是监管政策趋严,推动房地产回归本源,存量竞争时代开启 ...

  5. HTTPS 如何保证数据传输安全

    引言 为什么把这个作为选题. 大概也是2年前,我的同事,在面试某宇宙大厂遇到的问题与我一起探讨.这个时候我发现,虽然TLS(https)这个东西大部分时候可能不会被直接用到,但很容易被作为考察的目标范 ...

  6. 总结下对我对于CSS中BFC的认知

    首先第一个,什么是BFC? BFC的全称叫Block  Formatting  Context   (块级格式化上下文)BFC是css中隐含属性,开启BFC后元素会变成一个独立的布局环. 简单来说,它 ...

  7. 【每天学一点-03】 使用Html5+Less实现简单的静态登录界面(入门Less)

    1.首先引用Less 有npm安装.cdn引用.或者下载Less.js本地引用,我采用的是第三种方法 less.js引用: 下载地址:https://github.com/less/less.js/t ...

  8. SpringBoot中Tomcat和SpringMVC整合源码分析

    概述 ​ SpringBoot中集成官方的第三方组件是通过在POM文件中添加组件的starter的Maven依赖来完成的.添加相关的Maven依赖之后,会引入具体的jar包,在SpringBoot启动 ...

  9. uniapp调用jar

    前言 此方法为使用uniapp开发前端资源,然后继承进安卓原生项目,达到调用uniapp调用jar的效果. 基于Android Studio进行开发. 本人不懂安卓以及gradle,只是基于搜索引擎以 ...

  10. 2521-Shiro系列-基本使用

    在springboot中使用SHiro作为安全框架,非常简单,灵活性也比较高 在springboot中使用Shiro不用像官网教程那样,官网是将配置文件写在INI文件和XML配置中 springboo ...