java io系列05之 ObjectInputStream 和 ObjectOutputStream

本章,我们学习ObjectInputStream 和 ObjectOutputStream

ObjectInputStream 和 ObjectOutputStream 介绍

ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。

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

转载请注明出处: http://www.cnblogs.com/skywang12345/p/io_05.html

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)

演示程序

源码如下(ObjectStreamTest.java): 

/**
 * ObjectInputStream 和 ObjectOutputStream 测试程序
 *
 * 注意:通过ObjectInputStream, ObjectOutputStream操作的对象,必须是实现了Serializable或Externalizable序列化接口的类的实例。
 *
 * @author skywang
 */

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

public class ObjectStreamTest {
    private static final String TMP_FILE = "box.tmp";

    public static void main(String[] args) {
        testWrite();
        testRead();
    }

    /**
     * ObjectOutputStream 测试函数
     */
    private static void testWrite() {
        try {
            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 map = new HashMap();
            map.put("one", "red");
            map.put("two", "green");
            map.put("three", "blue");
            out.writeObject(map);
            // 写入自定义的Box对象,Box实现了Serializable接口
            Box box = new Box("desk", 80, 48);
            out.writeObject(box);

            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * ObjectInputStream 测试函数
     */
    private static void testRead() {
        try {
            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 iter = map.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry entry = (Map.Entry)iter.next();
                System.out.printf("%-6s -- %s\n" , entry.getKey(), entry.getValue());
            }
            // 读取Box对象,Box实现了Serializable接口
            Box box = (Box) in.readObject();
            System.out.println("box: " + box);

            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Box implements Serializable {
    private int width;
    private int height;
    private String name;   

    public Box(String name, int width, int height) {
        this.name = name;
        this.width = width;
        this.height = height;
    }

    @Override
    public String toString() {
        return "["+name+": ("+width+", "+height+") ]";
    }
}

运行结果

boolean:true
byte:65
char:a
int:20131015
float:3.140000
double:1.414000
two    -- green
one    -- red
three  -- blue
box: [desk: (80, 48) ]

 

时间: 2024-08-03 14:43:37

java io系列05之 ObjectInputStream 和 ObjectOutputStream的相关文章

java io系列06之 序列化总结(Serializable 和 Externalizable)

本章,我们对序列化进行深入的学习和探讨.学习内容,包括序列化的作用.用途.用法,以及对实现序列化的2种方式Serializable和Externalizable的深入研究. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_06.html 1. 序列化是的作用和用途 序列化,就是为了保存对象的状态:而与之对应的反序列化,则可以把保存的对象状态再读出来. 简言之:序列化/反序列化,是Java提供一种专门用于的保存/恢复对象状态的机制. 一般在以下几种

java io系列17之 System.out.println("hello world")原理

我们初学java的第一个程序是"hello world" 1 public class HelloWorld { 2 public static void main(String[] args) { 3 System.out.println("hello world"); 4 } 5 } 上面程序到底是怎么在屏幕上输出"hello world"的呢?这就是本来要讲解的内容,即System.out.println("hello world

java io系列20之 PipedReader和PipedWriter

本章,我们学习PipedReader和PipedWriter.它们和"PipedInputStream和PipedOutputStream"一样,都可以用于管道通信. PipedWriter 是字符管道输出流,它继承于Writer.PipedReader 是字符管道输入流,它继承于Writer.PipedWriter和PipedReader的作用是可以通过管道进行线程间的通讯.在使用管道通信时,必须将PipedWriter和PipedReader配套使用. 转载请注明出处:http:/

java io系列16之 PrintStream(打印输出流)详解

本章介绍PrintStream以及 它与DataOutputStream的区别.我们先对PrintStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_16.html PrintStream 介绍 PrintStream 是打印输出流,它继承于FilterOutputStream.PrintStream 是用来装饰其它输出流.它能为其他输出流添加了功能,使它们能够方便地打印

java io系列26之 RandomAccessFile

本文主要介绍 RandomAccessFile. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_26.html 更多内容请参考:java io系列01之 "目录"   RandomAccessFile RandomAccessFile 是随机访问文件(包括读/写)的类.它支持对文件随机访问的读取和写入,即我们可以从指定的位置读取/写入文件数据.需 要注意的是,RandomAccessFile 虽然属于java.io包,但它不是Inpu

java io系列21之 InputStreamReader和OutputStreamWriter

InputStreamReader和OutputStreamWriter 是字节流通向字符流的桥梁:它使用指定的 charset 读写字节并将其解码为字符.InputStreamReader 的作用是将"字节输入流"转换成"字符输入流".它继承于Reader.OutputStreamWriter 的作用是将"字节输出流"转换成"字符输出流".它继承于Writer. 转载请注明出处:http://www.cnblogs.com/

java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例

本章,我们对java 管道进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_04.html java 管道介绍 在java中,PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流.它们的作用是让多线程可以通过管道进行线程间的通讯.在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用.使 用管道通信时,大致的流程是:我们在线程A中向PipedOut

java io系列15之 DataOutputStream(数据输出流)的认知、源码和示例

本章介绍DataOutputStream.我们先对DataOutputStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_15.html DataOutputStream 介绍 DataOutputStream 是数据输出流.它继承于FilterOutputStream.DataOutputStream 是用来装饰其它输出流,将DataOutputStream和DataI

java io系列22之 FileReader和FileWriter

FileReader 是用于读取字符流的类,它继承于InputStreamReader.要读取原始字节流,请考虑使用 FileInputStream.FileWriter 是用于写入字符流的类,它继承于OutputStreamWriter.要写入原始字节流,请考虑使用 FileOutputStream. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_22.html 更多内容请参考:java io系列01之 "目录"   FileRea