对象流

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

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. Linux IO重定向和管道

    计算机组成部分: 由io . 控制器.计算器.存储器组成 IO: input output 计算机里面通过终端窗口实现输入和输出,键盘鼠标屏幕这些只是手段,真正完成输入输出的是终端窗口 标准输入.出. ...

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

    本章内容概要 1.运算符 2.流程控制 本章内容详解 1.运算符 什么是运算符? 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是" ...

  3. Python爬取某短视频热点

    写在前面的一些话: 随着短视频的大火,不仅可以给人们带来娱乐,还有热点新闻时事以及各种知识,刷短视频也逐渐成为了日常生活的一部分.本文以一个简单的小例子,简述如何通过Pyhton依托Selenium来 ...

  4. Python 数据科学手册:读书笔记概论

    为防止遗忘,在空闲时间将读书的笔记开始按照章节进行概括总结(2022.1.1): 第二章:NumPy 入门 第三章:Pandas 数据处理 第四章:Matplotlib 数据可视化 第五章:机器学习 ...

  5. Learning Latent Graph Representations for Relational VQA

    The key mechanism of transformer-based models is cross-attentions, which implicitly form graphs over ...

  6. Selenium指定浏览器路径

    ChromeOptions options = new ChromeOptions(); options.setBinary("C:\\Program Files (x86)\\Google ...

  7. Solution -「HNOI」EVACUATE

    Sol. 可以发现人的移动除了不能穿墙以外没有别的限制.也就是说人的移动多半不是解题的突破口. 接下来会发现出口的限制很强,即出口每个时刻只能允许一个人出去. 每个时刻? 不难想到对于每一个时刻每一个 ...

  8. 【Python3】列表字典集合元组

    1 列表 1.1 定义与索引 在Python中,第一个列表元素的下标为 0通过将索引指定为 -1 可以让Python返回最后一个列表元素 inventory = ['sword', 'armor', ...

  9. 「一本通 1.1 例 4」加工生产调度(贪心算法)(luogu P1248)题解

    加工生产调度 题目描述 某工厂收到了 n n n 个产品的订单,这 n n n 个产品分别在 A.B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工. 某个产品 i i i 在 A. ...

  10. .Net CLR R2R编译的原理简析

    前言 躺平了好一段时间了,都懒得动了.本文均为个人理解所述,如有疏漏,请指正. 楔子 金庸武侠天龙八部里面,少林寺至高无上的镇寺之宝,武林人士梦寐以求的内功秘笈易筋经被阿朱偷了,但是少林寺也没有大张旗 ...