Java_io体系之ObjectInputStream、ObjectOutputStream简介、走进源码及示例——11
这对流也是有输入才有输出、觉得先理清输出更容易理清这对流。因为这两个类源码中牵扯到的东西较多、所以这里只列出常用方法、实例、而没有关键字和源码、有兴趣的可以自己再深入研究一下。
一:ObjectOutputStream
1、类功能简介:
对象字节输出流、将一个序列化的对象写入到构造ObjectOutputStream时传入的底层字节输出流中、通过源码可以看出、他虽然不是实现了FilterOutputStream装饰类、同时实现了ObjectOut、而此接口实现了DataOut接口、并且对这个接口进行了扩展、使得ObjectOut在具有DataOut中定义的各种方法同时、也具有将对象、数组、字符串写入到底层字节流中的功能、这样也就意味着ObjectOutputStream同样具有DataOutputStream功能的同时也具有将对象、数组字符串写入到底层字节输出流中的功能、当然ObjectOuputStream同样还实现了别的接口、因为他写入一个对象的时候、不仅仅写入的是标示这个Object的所有属性、同时还有额外的一些信息、比如版本号、作者等、但是这些对我们是透明的、具体的写入方法由JDK说了算、从这里也可以看出ObjectOutputStream与DataOutputStream之间的差异、1、ObjectOutputStream是将一个对象的所有相关属性、信息(不包括方法)写入到底层流中、而DataOutputStream一次写入的只是一个java基础类型的数据、2、读取的时候ObjectOutputStream一次读取一个对象、不必关心对象每个属性的写入顺序、而DataOutputStream读取时要严格按照写入时的顺序读取(当然、在使用skip方法时还要考虑字节数)、有关序列化的有另一篇文章说明、总结时候也会给出一点有关序列化的认识。
2、ObjectOutputStreamAPI简介:
A:构造方法
protected ObjectInputStream(); 用于完全重新实现ObjectInputStream的子类的构造方法、使得子类可以拥有自己的私有关键字节、而不是使用ObjectInputStream自带的字节。
ObjectInputStream(InputStream in); 创建从指定 InputStream 读取的 ObjectInputStream。
B:一般方法
protected void annotateClass(Class<?> cl); 子类可以实现此方法,从而允许在流中存储类数据。
protected void annotateProxyClass(Class<?> cl); 子类可以实现此方法,从而在流中存储定制数据和动态代理类的描述符。
void close(); 关闭当前流、释放所有与此流有关的资源。
void defaultWriteObject(); 将表示当前类状态的属性写入到构造时传入的底层流out中。
protected void drain(); 将ObjectOutputStream 中的所有已缓冲数据写入到底层流中、注意:但是不flush底层流、
protected boolean enableReplaceObject(boolean enable); 允许流对流中的对象进行替换。
void flush(); 刷新该流的缓冲、这里也会将底层流中的数据flush到底层流指定的目的地中。
ObjectOutputStream.PutField putFields(); 获取用于缓冲写入流中的持久存储字段的对象。
protected Object replaceObject(Object obj); 在序列化期间,此方法允许 ObjectOutputStream 的受信任子类使用一个对象替代另一个对象。
void reset(); 重置将丢弃已写入流中的所有对象的状态。
void write(byte[] buf); 写入一个 byte 数组。
void write(byte[] buf, int off, int len); 写入字节的子数组。
void write(int val); 写入一个字节。
void writeBoolean(boolean val); 写入一个 boolean 值。
void writeByte(int val); 写入一个 8 位字节。
void writeBytes(String str); 以字节序列形式写入一个 String。
void writeChar(int val); 写入一个 16 位的 char 值。
void writeChars(String str); 以 char 序列形式写入一个 String。
protected void writeClassDescriptor(ObjectStreamClass desc); 将指定的类描述符写入 ObjectOutputStream。
void writeDouble(double val); 写入一个 64 位的 double 值。
void writeFields(); 将已缓冲的字段写入流中。
void writeFloat(float val); 写入一个 32 位的 float 值。
void writeInt(int val); 写入一个 32 位的 int 值。
void writeLong(long val); 写入一个 64 位的 long 值。
void writeObject(Object obj); 将指定的对象写入 ObjectOutputStream。
protected void writeObjectOverride(Object obj); 子类用于重写默认 writeObject 方法的方法。
void writeShort(int val); 写入一个 16 位的 short 值。
protected void writeStreamHeader(); 提供 writeStreamHeader 方法,这样子类可以将其自身的头部添加或预加到流中。
void writeUnshared(Object obj); 将“未共享”对象写入 ObjectOutputStream。
void writeUTF(String str); 以 UTF-8 修改版格式写入此 String 的基本数据。
4、实例演示:
与ObjectInputStream放在一起、仅针对写入对象进行操作、其他的写入基本类型的方法与DataOuputStream相似。
二:ObjectInputStream
1、类功能简介:
对象字节输入流、将一个序列化的对象通过底层字节输入流读取到程序中、与ObjectOutputStream相对应、实现了ObjectOut接口、而ObjectOut接口实现了DataOut接口、在DataOut接口定义的基础上扩展了读取对象、数组、字符串的功能、作为ObjectOut的实现类ObjectInputStream、它可以将使用ObjectOutputStream写入到底层输出流中的对象、数组、字符串读取到程序中、并还原成当初写入时的状态、这样我们就可以直接对这个对象进行操作。从而达到操作java对象、数组、字符串的目的。
2、ObjectInputStream API简介:
A:构造方法
protected ObjectInputStream(); 用于完全重新实现ObjectInputStream的子类的构造方法、使得子类可以拥有自己的私有关键字节、而不是使用ObjectInputStream自带的字节。
ObjectInputStream(InputStream in); 创建从指定 InputStream 读取的 ObjectInputStream。
B:一般方法
int available(); 返回可以不受阻塞地读取的字节数。
void close(); 关闭输入流。
void defaultReadObject(); 从此流读取当前类状态的属性(没有被 static、transient修饰的字段)。
protected boolean enableResolveObject(boolean enable); 使流允许从该流读取的对象被替代。
int read(); 读取数据字节。
int read(byte[] buf, int off, int len); 读入 byte 数组。
boolean readBoolean(); 读取一个 boolean 值。
byte readByte(); 读取一个 8 位的字节。
char readChar(); 读取一个 16 位的 char 值。
protected ObjectStreamClass readClassDescriptor(); 从序列化流读取类描述符。
double readDouble(); 读取一个 64 位的 double 值。
ObjectInputStream.GetField readFields(); 按名称从流中读取持久字段并使其可用。
float readFloat(); 读取一个 32 位的 float 值。
void readFully(byte[] buf); 读取字节,同时阻塞直至读取所有字节。
void readFully(byte[] buf, int off, int len); 读取字节,同时阻塞直至读取所有字节。
int readInt(); 读取一个 32 位的 int 值。
String readLine(); 已过时。 此方法不能正确地将字节转换为字符。请参见 DataInputStream 以获取详细信息和替代方法。
long readLong(); 读取一个 64 位的 long 值。
Object readObject(); 从 ObjectInputStream 读取对象。
protected Object readObjectOverride(); 此方法由 ObjectOutputStream 的受信任子类调用,这些子类使用受保护的无参数构造方法构造 ObjectOutputStream。
short readShort(); 读取一个 16 位的 short 值。
protected void readStreamHeader(); 提供的 readStreamHeader 方法允许子类读取并验证它们自己的流头部。
Object readUnshared(); 从 ObjectInputStream 读取“非共享”对象。
int readUnsignedByte(); 读取一个无符号的 8 位字节。
int readUnsignedShort(); 读取一个无符号的 16 位 short 值。
String readUTF(); 读取 UTF-8 修改版格式的 String。
int skipBytes(int len); 跳过字节。
4、实例演示:
StudentDTO类:
package com.chy.io.original.utils;
import java.io.Serializable;
public class StudentDTO implements Serializable{
private static final long serialVersionUID = -4969451826117657169L;
private int sno = 1;
private String name = "chy";
private int statu = 5;
public StudentDTO(int sno, String name,int statu) {
super();
this.sno = sno;
this.name = name;
this.statu = statu;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStatu() {
return statu;
}
public void setStatu(int statu) {
this.statu = statu;
}
}
测试类:
package com.chy.io.original.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.chy.io.original.utils.StudentDTO;
public class ObjectStreamTest {
private static File file = new File("D:\\oos.txt");
public static void testObjectOutputStream() throws IOException{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
StudentDTO swrite = new StudentDTO(1, "chy", 5);
oos.writeObject(swrite);
}
public static void testObjectInputStream() throws IOException, ClassNotFoundException{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
StudentDTO s = new StudentDTO(2, "chy1", 10);
StudentDTO sread = (StudentDTO)ois.readObject();
/**
* 当statu的类型是int时的result: sno: 1 name: chy statu: 5
* 当statu的修饰符是static时的result: sno: 1 name: chy statu: 10
* 当statu的修饰符是transient时的result: sno: 1 name: chy statu: 0
*/
System.out.println(sread.toString());
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
testObjectOutputStream();
testObjectInputStream();
}
}
这里不再将statu的类型为static、transient的代码贴出来、只是改变修饰符、可自己修改。
这里要注意一个地方、就是在测试ObjectInputStream的时候、多创建了一个没有使用的StudentDTO s、目的是为了防止后面将StudentDTO中的一个变量的类型改成static的时候、因为读取的对象中这个值与写入的时候一样而造成static变量可以写入底层流的假象。
shuchu
总结:
ObjectOutputStream、ObjectInputStream这对流本质上就是操作序列化对象、用于在介质间进行传递序列化对象的属性、当然、当我们想要保存对象的某个属性的时候可以使用DataOutputStream、DataInputStream这对流、但是当我们要保存的属性恰好组成了一个对象、并且这个对象还有版本、作者等信息时、DataOutputStream这对流就不能满足我们了、其实如上面所说、ObjectInputStream这对流也是间接实现了DataOutputStream这对流的接口、并且中间穿插了一个ObjectOut这对接口、这对接口对DataOut这对进行了扩展、满足传输对象、数组、字符串。
分享到:
相关推荐
(1)用java写的RPC调用的demo。...(2)没有用到其他的jar包,java对象和流之间的转换用的是java.io.ObjectInputStream和java.io.ObjectOutputStream。 (3)下载解压,可以直接导入Eclipse运行调试。
import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java....
ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。本文给大家详细介绍了ObjectInputStream 和 ObjectOutputStream的相关知识,感兴趣的朋友一起学习吧
import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.io.IOException; import java.io.EOFException; import java.net.ServerSocket; import java.net.Socket; import java.awt....
import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class StuC { ArrayList <Student> al=new ArrayList();//类型ArrayList是集合,在定义ArrayList类型...
我自己写的一些关于IO中的见解,可以用来参考。 File的增、删、改、查,FileReader和FileWriter类,BufferedReader和BufferedWriter类,ObjectOutputStream和ObjectInputStream类
拿点积分啊,不然不给下东西. Java Object的一个学习源码.
4.java.io包中的objectinputstream和objectoutputstream类主要用于对对象(Object)的读写。 5.android 中service的实现方法是:startservice和bindservice。 6.activity一般会重载7个方法用来维护其生命周期,除了...
|--ObjectOutputStream/:将java对象的基本数据类型和图形写入到OutputStream。 | |--PipedOutputStream/:可以将管道输出流连接到管道输入流来创建通信管道。 | 用方法connect(PipedInputStream snk) 将此管道...
ObjectInputStream序列化实例,简单就学会,JAVA原来so easy
JavaIO对象流 FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合 奥利弗·缪尔
Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。 类摘要 BufferedInputStream BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。 ...
主要介绍了java序列化与ObjectOutputStream和ObjectInputStream的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据...
ObjectInputStream的用法---马克-to-win java视频的介绍对象输入字节流
其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ObjectOutputStream ObjectInputStream Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第7页。...
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2552) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297) at java.io.ObjectInputStream.readObject...
ObjectInputStream和ObjectOutputStream 158 PrintStream 158 Reader 158 Writer 159 FileReader和FileWriter 159 BufferReader和BufferWriter 159 InputStreamReader和OutputStreamWriter 161 JAVA对象的序列化和反...
a)java.sql b) java.util c) java.math d) java.io 2.不属于java.io包中的接口的一项是(C) a)DataInput b) DataOutput c) DataInputStream d) ObjectInput 3. ByteArrayOutputStream将下列哪一项作为输出流 C a)...
简洁分类 代码直接使用 InputStream OutputStream Reader Writer FileInputStream FileOutputStream FileReader FileWriter InputStreamReader ...ObjectOutputStream ObjectInputStream Scanner