对象输出流和对象输入流可以为应用提供对象持久化的功能,分别调用文件输出流和文件输入流来实现。另一种使用对象流的场景是,在不同主机用socket流在远程通信系统中传递传递数据。

1.ObjectInputStream

对象输入流是用来恢复之前序列化存储的对象,对象输入流可以确保每次从流中读取的对象能匹配Java虚拟机中已经存在的类,根据需求使用标准机制加载类。另外只有支持Serializable或者Externalizable接口的类可以从流中读取出来。对象输入流继承了InputStream中字节读取方法,具体点击这里;另外有一些常用的方法:
boolean readBoolean()
读出布尔类型数据

byte readByte()
读取一个8比特字节

char readChar()
读取一个16比特的字符

double readDouble()
读取一个64比特的double类型数据

float readFloat()
读取一个32比特的float类型数据

void readFully(byte[] buf)
将流中所有的字节读取到buf字节数组中

void readFully(byte[] buf, int off, int len)
从流中读取len个字节数据到buf中,第一个字节存放在buf[off],第二个字节存放在buf[off+1],以此类推

int readInt()
读取一个32比特的int类型数据

long readLong()
读取一个64比特的long类型数据

Object readObject()
从流中读取一个对象数据,包括对象所属的类,该类的签名,类中非瞬态和非静态的字段值以及所有非超类型的字段值

short readShort()
读取一个16比特的short类型数据

int readUnsignedByte()
读取一个非负的8比特字节,转换为int类型返回

int readUnsignedShort()
读取非负的16比特的short类型数据,转换为int类型返回

String readUTF()
读取一个按UTF-8编码的String类型的数据

2.ObjectOutputStream

对象输出流用来持久化对象的,可以将对象数据写入到文件,如果流是网络流,则可以将对象传输给其他用户进行通信。只有支持Serializable接口的对象支持写入到流,每个序列化对象被编码,包括类的名称和类的签名,以及类的对象中的字段值,以及arrays变量,以及从初始化对象引用的任何其他对象的闭包。

对象输出流继承了OutputStream中字节写的方法,具体点击这里;另外常用的方法有:
void writeBoolean(boolean val)
写一个布尔类型数据

void writeByte(int val)
写一个8比特字节数据,int类型只截取第8位

void writeBytes(String str)
将一个字符串数据当作一个字节序列写入流中

void writeChar(int val)
写入一个16比特的字符数据,参数为int,只截取低16位

void writeChars(String str)
将一个字符串数据当作一个字符序列写入

void writeDouble(double val)
写入一个64比特的double类型数据

void writeFloat(float val)
写入一个32比特的float类型数据

void writeLong(long val)
写入一个64比特的long类型数据

void writeObject(Object obj)
将一个对象写入到流中,包括类的名称和类的签名,以及类的对象中的字段值,
以及arrays变量,以及从初始化对象引用的任何其他对象的闭包。

void writeShort(int val)
将一个16比特的short类型数据写入到流中

void writeUTF(String str)
将一个按UTF-8编码的字符串数据写入到流中

3.例子

分别以读写对象为例子。定义了一个Person类,用来测试读写对象,然后分别建立了两个java项目,一个用来写对象,一个用来读对象;两个java工程都应该包括Person对象的定义,要保证两个工程中Person的包名和类名都一致,代码如下:
Person类代码:

package model;import java.io.Serializable;
import java.util.Date;public class Person implements Serializable{public String name;public int year;public Date birth;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}/**重写toString函数,返回内容包括名字,年龄和生日*/public String toString(){return name.toString() + " " + year + " " + birth.toString();}
}

写对象java代码:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Date;import model.Person;public class ObjectTest {public static void main(String[] args) throws IOException{FileOutputStream fos = new FileOutputStream("G:\\person.obj");       //定一个文件输出流,用来写文件ObjectOutputStream oos = new ObjectOutputStream(fos);                //用文件输出流构造对象输出流Person p1 = new Person();                                            //定义两个对象Person p2 = new Person();p1.setName("福国");p1.setYear(23);p1.setBirth(new Date(95,6,12));p2.setName("zhangbin");p2.setYear(24);p2.setBirth(new Date(94,1,2));oos.writeObject(p1);                                                 //将两个对象写入文件oos.writeObject(p2);oos.close();fos.close();}
}

读对象java代码:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;import model.Person;public class ObjectTest {public static void main(String[] args) throws IOException, ClassNotFoundException{FileInputStream fis = new FileInputStream("G:\\person.obj");      //构造文件输入流ObjectInputStream ois = new ObjectInputStream(fis);               //用文件输出流初始化对象输入流Person p1 = (Person)ois.readObject();                             //依次读出对象Person p2 = (Person)ois.readObject();System.out.println("p1的内容为:"+p1.toString());System.out.println("p2的内容为:"+p2.toString());}
}

运行结果截图为:

java中对象输入流和输出流相关推荐

  1. java中字节输入流和输出流的简单使用例子

    import java.io.IOException;public class HelloWorld {public static void main(String []args) {File fil ...

  2. Java中对象的串行化(Serialization)和transient关键字

    Java中对象的串行化(Serialization)和transient关键字 前言: 该篇文章参考自网上资料,但是部分内容经过笔者更改,因此算作原创吧,原文地址: http://www.golden ...

  3. java io字符输出流_灵魂一击!详解Java中的IO输入输出流

    什么是流?流表示任何有能力产生数据的数据源对象或者是有能力接收数据的接收端对象,它屏蔽了实际的I/O设备中处理数据的细节. IO流是实现输入输出的基础,它可以很方便地实现数据的输入输出操作,即读写操作 ...

  4. Java中对象的储存区

    文章目录 1 两个重要的问题 2 C语言中数据的存储区 3 Java中对象的储存区 4 Java为什么采用动态内存分配? 4 为什么基本类型是特例? 1 两个重要的问题 对象的数据位于何处? 如何控制 ...

  5. Java中对象的实例化顺序

    文章目录 1 Java中对象的实例化顺序 1 Java中对象的实例化顺序 继承后的初始化顺序: 静态成员包括静态构造代码块,初始化顺序跟书写顺序有关.

  6. 浅析Java中对象的创建与对象的数据类型转换

    这篇文章主要介绍了Java中对象的创建与对象的数据类型转换,是Java入门学习中的基础知识,需要的朋友可以参考下 Java:对象创建和初始化过程 1.Java中的数据类型     Java中有3个数据 ...

  7. Java中对象的三种状态

    转载自   Java中对象的三种状态 Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究. 状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可 ...

  8. Java中对象和引用的理解

    2019独角兽企业重金招聘Python工程师标准>>> 偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两 ...

  9. java中的的一些生命周期,Java中对象的生命周期

    Java中对象的生命周期 (1) 对象生命周期的开始 对象生命周期开始时,需要为对象分配内存,并且初始化它的实例变量: 对象生命周期结束 Java虚拟机的垃圾回收线程回收对象的内存. (2) 创建一个 ...

最新文章

  1. 美酒节成就及任务攻略指引
  2. java后期发展方向_2020年前3季度工程自卸车市场咋样?后期朝啥方向发展?
  3. RX学习笔记:正则表达式
  4. 今天的一下子跳出来了的超级玛丽
  5. 数据库事务隔离级别+Spring 声明性事务隔离级别
  6. python的顶级库_三大用于数据科学的顶级Python库
  7. QT 读取txt 文件
  8. redis锁的几种实现
  9. python列表获取最后一个元素的方法_在Python中获取列表的最后一个元素
  10. java jimi_Java开源工具Jimi处理图片大小及格式转换
  11. 网络爬虫笔记—Selenium
  12. D38 Java智能电话项目本————创建实体类
  13. ChemDraw加键的两种方法
  14. 堆和栈得区别--向WXP学习
  15. 三个限免网站,助你白嫖正版付费软件/游戏
  16. OCJP(1Z0-851) 模拟题分析(二)
  17. 使用html+css完成仿站操作要点
  18. 二维火视频菜单,开启沉浸式点餐新体验
  19. 画论69 汪之元《天下有山堂画艺》
  20. python遍历excel单元格内容_如何遍历excel文件获取单元格内容并在websi上以表单形式编写...

热门文章

  1. iOS视图控制器之间delegate传值教程
  2. PHP学习笔记【9】_表达式
  3. Qt应用程序只运行一个实例
  4. VSCode 调试 Egg 完美版 - 进化史 #25
  5. CryptoJS DES加密示例
  6. Spring MVC 安全示例
  7. java 课后习题 随机整数最大值和最小值
  8. 正则规则大全 JAVA
  9. 【C语言】利用递归函数求n的阶乘
  10. C#LeetCode刷题之#219-存在重复元素 II​​​​​​​(Contains Duplicate II)