对象操作流
实现对象的序列化(对象转换为字节序列的过程)和反序列化(字节序列恢复为Java对象的过程),达到网络传输、本地存储的目的。
仅支持实现java.io.Serializable或java.io.Externalizable接口的对象使用。
ObjectInputStream
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
实现的接口
Closeable , DataInput , ObjectInput , ObjectStreamConstants , AutoCloseable
部分方法
| 变量和类型 | 方法 | 描述 |
|---|---|---|
int |
available() |
返回可以不阻塞地读取的字节数。
|
void |
close() |
关闭输入流。
|
void |
defaultReadObject() |
从此流中读取当前类的非静态和非瞬态字段。
|
int |
read() |
读取一个字节的数据。
|
int |
read(byte[] buf, int off, int len) |
读入一个字节数组。
|
boolean |
readBoolean() |
读入布尔值。
|
byte |
readByte() |
读取一个8位字节。
|
char |
readChar() |
读取16位字符。
|
protected ObjectStreamClass |
readClassDescriptor() |
从序列化流中读取类描述符。
|
double |
readDouble() |
读取64位双精度数。
|
ObjectInputStream.GetField |
readFields() |
从流中读取持久字段并使其按名称可用。
|
float |
readFloat() |
读取32位浮点数。
|
void |
readFully(byte[] buf) |
读取字节,阻塞直到读取所有字节。
|
void |
readFully(byte[] buf, int off, int len) |
读取字节,阻塞直到读取所有字节。
|
int |
readInt() |
读取32位int。
|
String |
readLine() |
已过时。
此方法无法将字节正确转换为字符。
|
long |
readLong() |
读长64位。
|
Object |
readObject() |
从ObjectInputStream中读取一个对象。
|
ObjectOutputStream
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
实现的接口
Closeable , DataOutput , Flushable , ObjectOutput , ObjectStreamConstants , AutoCloseable
部分方法
| 变量和类型 | 方法 | 描述 |
|---|---|---|
void |
close() |
关闭流。
|
void |
defaultWriteObject() |
将当前类的非静态和非瞬态字段写入此流。
|
void |
flush() |
刷新流。
|
protected Object |
replaceObject(Object obj) |
此方法将允许ObjectOutputStream的受信任子类在序列化期间将一个对象替换为另一个对象。
|
void |
reset() |
重置将忽略已写入流的任何对象的状态。
|
void |
write(byte[] buf) |
写一个字节数组。
|
void |
write(byte[] buf, int off, int len) |
写一个子字节数组。
|
void |
write(int val) |
写一个字节。
|
void |
writeBoolean(boolean val) |
写一个布尔值。
|
void |
writeByte(int val) |
写一个8位字节。
|
void |
writeBytes(String str) |
将String写为字节序列。
|
void |
writeChar(int val) |
写一个16位字符。
|
void |
writeChars(String str) |
将String写为一系列字符。
|
protected void |
writeClassDescriptor(ObjectStreamClass desc) |
将指定的类描述符写入ObjectOutputStream。
|
void |
writeDouble(double val) |
写一个64位双。
|
void |
writeFields() |
将缓冲的字段写入流。
|
void |
writeFloat(float val) |
写一个32位浮点数。
|
void |
writeInt(int val) |
写一个32位的int。
|
void |
writeLong(long val) |
写入64位长。
|
示例
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("stu.txt"))) { out.writeObject(new Student("aaa", 111)); } catch (Exception e) { System.out.println(e.getMessage()); } try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("stu.txt"))) { in.readObject(); } catch (Exception e) { e.printStackTrace(); } class Student implements Serializable {
private String name;
private int age;
}
对象部分属性序列化
使用transient修饰符,在序列化时忽略属性
private transient String name;
使用static修饰符
private static String name;
// 在序列化后,给static修饰的属性重新赋值,反序列化后获取的值是重新赋值之后的值
默认方法writeObject和readObject
private void writeObject(ObjectOutputStream objOut) throws IOException { System.out.println("writeObject-----------"); objOut.writeObject(name); } private void readObject(ObjectInputStream objIn) throws IOException,ClassNotFoundException { System.out.println("readObject-----------"); name= (String) objIn.readObject(); }
// 指定会被序列化的属性
// 必须使用 private void 修饰这两个方法
// Java调用ObjectOutputStream类检查其是否有私有的、无返回值的writeObject方法,如果有, 其会委托该方法进行对象序列化。
Externalizable
public interface Externalizable extends Serializable
使用Externalizable接口需要实现readExternal方法和 writeExternal方法来实现序列化和反序列化
@Override public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(name); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { name= (String) in.readObject(); }
Serializable和Externalizable区别
| 区 别 | Serializable | Externalizable |
| 实现复杂度 | 实现简单,Java对其有内建支持 | 实现复杂,由开发人员自己完成 |
| 执行效率 | 所有对象由Java统一保存,性能较低 | 开发人员决定哪个对象保存,可能造成速度提升 |
| 保存信息 | 保存时占用空间大 | 部分存储,可能造成空间减少 |
| 使用频率 | 高 | 偏低 |
posted on
浙公网安备 33010602011771号