文档章节

JavaIO<4>--ObjectInputStream和ObjectOutputStream

Zhao-Qian
 Zhao-Qian
发布于 2014/11/12 11:12
字数 655
阅读 23
收藏 0
点赞 0
评论 0

ObjectInputStream 和 ObjectOutputStream 介绍

ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持
创建“文件输出流”对应的ObjectOutputStream对象,该ObjectOutputStream对象能提供对“基本数据或对象”的持久存储;当我们需要读取这些存储的“基本数据或对象”时,可以创建“文件输入流”对应的ObjectInputStream,进而读取出这些“基本数据或对象”。
注意: 只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能被ObjectInputStream/ObjectOutputStream所操作!

ObjectOutputStream 函数列表

// 构造函数  
ObjectOutputStream(OutputStream output)  
// public函数  
void     close()  
void     defaultWriteObject()  
void     flush()  
ObjectOutputStream.PutField     putFields()  
void     reset()  
void     useProtocolVersion(int version)  
void     write(int value)  
void     write(byte[] buffer, int offset, int length)  
void     writeBoolean(boolean value)  
void     writeByte(int value)  
void     writeBytes(String value)  
void     writeChar(int value)  
void     writeChars(String value)  
void     writeDouble(double value)  
void     writeFields()  
void     writeFloat(float value)  
void     writeInt(int value)  
void     writeLong(long value)  
final void     writeObject(Object object)  
void     writeShort(int value)  
void     writeUTF(String value)  
void     writeUnshared(Object object) 
ObjectInputStream 函数列表

// 构造函数  
ObjectInputStream(InputStream input)  
 
int     available()  
void     close()  
void     defaultReadObject()  
int     read(byte[] buffer, int offset, int length)  
int     read()  
boolean     readBoolean()  
byte     readByte()  
char     readChar()  
double     readDouble()  
ObjectInputStream.GetField     readFields()  
float     readFloat()  
void     readFully(byte[] dst)  
void     readFully(byte[] dst, int offset, int byteCount)  
int     readInt()  
String     readLine()  
long     readLong()  
final Object     readObject()  
short     readShort()  
String     readUTF()  
Object     readUnshared()  
int     readUnsignedByte()  
int     readUnsignedShort()  
synchronized void     registerValidation(ObjectInputValidation object, int priority)  
int     skipBytes(int length)

演示程序

package org.credo.jdk.io.ObjectStreamTest;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;

public class ObjectStreamTest
{

	public static void main(String[] args)
	{
		try
		{
			testWrite();
			testRead();
		} catch (IOException | ClassNotFoundException e)
		{
			e.printStackTrace();
		}
	}

	private static final String TMP_FILE = "computer.tmp";
	

	public static void testWrite() throws FileNotFoundException, IOException
	{
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(TMP_FILE));
		out.writeBoolean(true);
		out.writeByte((byte) 65);
		out.writeChar('a');
		out.writeInt(20131015);
		out.writeFloat(3.14F);
		out.writeDouble(1.414D);
		// 写入HashMap对象  
        HashMap<String,String> map = new HashMap<>();  
        map.put("one", "red");  
        map.put("two", "green");  
        map.put("three", "blue");  
        out.writeObject(map);  
        // 写入自定义的Computer对象,Computer实现了Serializable接口  
        Computer computer=new Computer(1, 5666.66, "Y480");
        out.writeObject(computer);
        out.close();
	}
	
	@SuppressWarnings("rawtypes")
	public static void testRead() throws FileNotFoundException, IOException, ClassNotFoundException
	{
		ObjectInputStream in=new ObjectInputStream(new FileInputStream(TMP_FILE));
		System.out.printf("boolean:%b\n" , in.readBoolean());  
        System.out.printf("byte:%d\n" , (in.readByte()&0xff));  
        System.out.printf("char:%c\n" , in.readChar());  
        System.out.printf("int:%d\n" , in.readInt());  
        System.out.printf("float:%f\n" , in.readFloat());  
        System.out.printf("double:%f\n" , in.readDouble());
        
        // 读取HashMap对象  
        HashMap map = (HashMap) in.readObject();
        Iterator iterator=map.entrySet().iterator();
        while (iterator.hasNext())
		{
			Map.Entry mapEntry = (Map.Entry) iterator.next();
			System.out.printf("%-6s -- %s\n" , mapEntry.getKey(), mapEntry.getValue());
		}
        
        //读取Computer
        Computer computer=(Computer)in.readObject();
        System.out.println("computer: " + computer);
        in.close();
	}

}

class Computer implements Serializable
{

	private static final long serialVersionUID = -6347513352513264586L;

	private int id;
	private double price;
	private String name;
	
	public Computer(int id,double price,String name) {
		this.id=id;
		this.price=price;
		this.name=name;
	}

	public int getId()
	{
		return id;
	}

	public void setId(int id)
	{
		this.id = id;
	}

	public double getPrice()
	{
		return price;
	}

	public void setPrice(double price)
	{
		this.price = price;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	@Override
	public int hashCode()
	{
		return HashCodeBuilder.reflectionHashCode(this);
	}

	@Override
	public boolean equals(Object obj)
	{
		return EqualsBuilder.reflectionEquals(this, obj);
	}

	@Override
	public String toString()
	{
		return ToStringBuilder.reflectionToString(this);
	}

}

输出

boolean:true
byte:65
char:a
int:20131015
float:3.140000
double:1.414000
three  -- blue
two    -- green
one    -- red
computer: org.credo.jdk.io.ObjectStreamTest.Computer@4935b92e[id=1,price=5666.66,name=Y480]


© 著作权归作者所有

共有 人打赏支持
Zhao-Qian
粉丝 309
博文 156
码字总数 237336
作品 0
朝阳
高级程序员
java7IO库学习笔记

很多文章从JAVA IO的层次结构来分析。 这里按各IO类的作用来记录。 总体描述 javaIO库主要分为字节流和字符流; RandomAccessFile是直接从Object继承 FileReader FileWriter FilterInputStr...

taojinhuo ⋅ 2014/05/16 ⋅ 0

java的输入输出_将字符串写入文本文件

一、Filewriter与File——-将字符串写入文本文件 public static void main(String[] args) { } 二、InputStream与OutputStream 输入与输出串流 public static void main(String args[]){ pu......

huguzhang的博客 ⋅ 2017/12/16 ⋅ 0

java项目中利用memcached做session共享报错

今天用memcached在集成到java项目之后出现了问题:(运维已经搭好了服务) 场景:用其中一台服务器访问,登陆成功之后,关闭这台服务器,之后登陆另一台服务器,不能把user信息共享过去。 环...

SLLK ⋅ 2016/07/27 ⋅ 3

序列化中关于继承

实验1 结论: 如果Super类包含需要序列化的primitive类型变量,应该实现writeObject()和readObject()方法,并在里面分别调用ObjectOutputStream.defaultWriteObject()和ObjectInputStream.d...

Winchell ⋅ 2016/12/14 ⋅ 0

Java 使用 ObjectStream 时的注意事项

在向下阅读之前,请注意 JavaBean 要实现 Serializable 接口。 初始化时发生了什么? ObjectOutputStream 初始化时会送出其 header 数据给对端。ObjectInputStream 初始化时会阻塞地接收来自...

傅易 ⋅ 2016/12/12 ⋅ 0

3、将对象存储到zookeeper中,然后再拿下来还原

===利用byte[]和ObjectOutputStream 、ObjectInputStream============>将对象序列化到zookeeper HostAndThreadNumss hostAndThreadNum_send = new HostAndThreadNumss("hadoop1",3); byte[] ......

刘付kin ⋅ 2016/12/04 ⋅ 0

Java IO中对象的序列化操作

Java IO 中对象的序列化操作 这是一个在IO中比较基础的问题,但是因为很少用到,很容易遗忘,面试的时候可能会遇到,所以记录到博客上,防止忘记 其实代码很简单:主要是用到两个类ObjectInputStre...

墙头草 ⋅ 2011/06/13 ⋅ 0

obj 《---》byte[] 《---》ByteBuffer

1:将一个对象转化为写入:二进制数组缓冲区byte[]、写入一个文件等。 =======>写入缓冲区===== HostAndThreadNum hostAndThreadNum = new HostAndThreadNum("hadoop1",3);//定义一个缓冲区。...

刘付kin ⋅ 2016/12/08 ⋅ 0

java.io.StreamCorruptedException: invalid strea...

http://9iu.org 我们一般用ObjectInputStream输入流时,常常会因为直接给一个byte []数组作为参数,那样就会出错。 代码如下: package org.test; import java.io.ByteArrayInputStream; imp...

光石头 ⋅ 2011/11/19 ⋅ 0

Java Socket(二)使用TCP传输对象

在Java Socket使用TCP的基础上,通过ObjectInputStream和ObjectOutputStream来读写对象。

YuanyuanL ⋅ 2016/12/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

服务网关过滤器

过滤器作用 我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会...

明理萝 ⋅ 18分钟前 ⋅ 1

【2018.06.21学习笔记】【linux高级知识 14.1-14.3】

14.1 NFS介绍 NFS服务全称是NetWork File System:网络文件系统,最早有sun公司开发的,4.0版本由Netapp公司开发,是基于RPC远程过程调用(Remote Procedure Call)协议的服务。 14.2 NFS服务...

lgsxp ⋅ 27分钟前 ⋅ 0

Day18 vim编辑模式、命令模式与练习

编辑模式 命令模式 :nohl 不高亮显示 :x与:wq类似,如果在更改文件之后操作,两者效果一样;如果打开文件,没有任何操作; :wq会更改mtime,但是:x不会。 练习题 扩展 vim的特殊用法 ht...

杉下 ⋅ 30分钟前 ⋅ 0

Enum、EnumMap、EnumSet

1、Enum 不带参数 public enum Car { AUDI { @Override public int getPrice() { return 25000; } }, MERCEDES { ......

职业搬砖20年 ⋅ 31分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 32分钟前 ⋅ 0

线程组和 ThreadLocal

前言 在上面文章中,我们从源码的角度上解析了一下线程池,并且从其 execute 方法开始把线程池中的相关执行流程过了一遍。那么接下来,我们来看一个新的关于线程的知识点:线程组。 线程组 ...

猴亮屏 ⋅ 33分钟前 ⋅ 0

相对路径和绝对路径

基本概念   文件路径就是文件在电脑中的位置,表示文件路径的方式有两种,相对路径和绝对路径。在网页设计中通过路径可以表示链接,插入图像、Flash、CSS文件的位置。   物理路径:物理路...

临江仙卜算子 ⋅ 37分钟前 ⋅ 0

消息队列属性及常见消息队列介绍

什么是消息队列? 消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储,一个队列的消息可以同时被多个消息消费者消费。分布式消息服务DMS则是分布式的队列系统,消...

中间件小哥 ⋅ 40分钟前 ⋅ 0

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器...

笔阁 ⋅ 40分钟前 ⋅ 0

vim编辑模式、vim命令模式

vim编辑模式 使用vim filename 进入的界面是一般模式,在这个模式下虽然我们能够查看,复制,剪切,粘贴,但是不能编辑新的内容,如何能直接写入东西呢?这就需要进入编辑模式了,从一般模式...

李超小牛子 ⋅ 43分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部