对象流

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

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. VisionPro · C# · 加载与保存视觉工具包

    当项目程序被启动或更换程序产品型号时,我们需要提前加载对应的VisionPro的程序VPP文件,以提高程序调用效率. 加载代码: 1 using System; 2 using System.Wind ...

  2. 【python基础】第07回 运算符和流程控制 2

    本章内容概要 1.逻辑运算符补充 2.循环结构 本章内容详解 1.逻辑运算符补充 两边都不为0的情况 or 直接取前面的值 and 直接取后面的值如果存在0的情况 and 直接取0 or 直接取非0 ...

  3. Numpy的ndarray数组基础

    NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放同类型元素的多维数组. 1.数组的 ...

  4. 学习C4C的视频分享

  5. CentOS 7 快速安装docker-compose

    安装docker-composegithub的地址下载太慢了,国内可以使用http://get.daocloud.io/#install-compose网站上面的地址. 首先下载docker-comp ...

  6. mysql拆分字符串做条件查询

    mysql拆分字符串作为查询条件 有个群友问一个问题 这表的ancestors列存放的是所有的祖先节点,以,分隔 例如我查询dept_id为103的所有祖先节点,现在我只有一个dept_id该怎么查 ...

  7. OneOS家族,LITE版小兄弟诞生了!

    号外,号外!OneOS-Lite诞生啦!前有大哥OneOS,以及一众优秀的RTOS,正所谓珠玉在前,我很难啊.但我可不能怂,大哥叫小O,我就叫小L,站在大哥的肩上,小小L也有发光发热的机会. 小L代码 ...

  8. 手机APP无法抓包HTTPS解决方案

    问题表现:某个APP的HTTPS流量抓取不到,Fiddler报错,但可以正常抓取其它的HTTPS流量 可能原因: 1.Flutter应用,解决方案:https://www.cnblogs.com/lu ...

  9. C++学习记录1

    代码1:转义字符 点击查看代码 #include<iostream> using namespace std; void test01()//换行 { cout << &quo ...

  10. 获取某个html元素相对于视窗的位置集合

    getBoundingClientRect() getBoundingClientRect()获取元素位置,这个方法没有参数 getBoundingClientRect()用于获得页面中某个元素的左, ...