public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
对象和对象输入流可以提供持久存储应用程序的图形对象时使用一个和FileInputStream分别。对象输入流是用来恢复以前那些对象序列化。其他用途包括主机使用Socket流或编组和解组的参数和参数的远程通信系统之间传递对象。
确保在创建对象输入流从流匹配类的java虚拟机当前图中所有对象的类型。按要求加载类,使用标准机制。
只有对象支持java.io.serializable或java.io.externalizable接口可以读取流。
方法readObject
是用来读取从流对象。java的安全铸造应该用来获得想要的类型。在java中,字符串和数组是对象和处理对象序列化期间。当阅读时,他们需要被转换到预期的类型。
原始数据类型可以从流中读到使用适当的方法对数据输入。
对象的默认序列化机制将每个字段的内容和类型的值时写的。字段声明为短暂的或静态的反序列化过程中忽视。对其他对象的引用会导致这些对象在必要时从流中读取。对象的图形恢复正确使用参考共享机制。新的对象总是分配当反序列化,使现有的对象被覆盖。
读取一个对象类似于运行一个新对象的构造函数。内存分配给该对象,并初始化为零(空)。无参数构造函数的非序列化的类调用,然后对序列化的类字段恢复从流从序列化类接近整理java.lang.Object对象的最具体的类。
例如从流在ObjectOutputStream的例子:
读写
FileInputStream FIS =新的输入(“t.tmp”);ObjectInPutStream OIS =新对象输入流(FIS);int i = readint() OIS;字符串(String)今天= readobject() OIS;日期=(日期)readobject() OIS;OIS。();
类控制它们是如何被实施的java.io.serializable或java.io.externalizable接口。
实现Serializable接口允许对象序列化保存和恢复对象的整个状态,它允许类进化的时间流写入的时间是一念之间。它会自动遍历对象间的引用,保存和恢复整个图。
序列化的类,需要特殊处理的序列化和反序列化过程中应实现以下的方法:
private void writeObject(java.io.objectoutputstream流)抛出IOException;private void readObject(java.io.objectinputstream流)抛出IOException,时抛出;private void readobjectnodata()把objectstreamexception;
readObject方法负责阅读和使用相应的writeObject方法流写入的数据恢复其特定的类的对象的状态。该方法不需要担心自己属于其超类或子类的状态。状态是读数据从对象输入流对个人领域和分配对象的相应字段恢复。阅读原始数据类型支持的数据输入。
任何试图读取对象数据超过相应的writeObject方法编写自定义的数据边界将导致optionaldataexception被与真正的EOF字段值。非对象读取超过所分配的数据最终将反映在他们表示流的结尾相同的方式结束:该数据读取将返回1字节读取或读取到的字节数,而原始的阅读会把eofexceptions。如果没有相应的writeObject方法,则默认的序列化的数据标志着结束分配的数据结束。
原始对象读取电话发出的readexternal方法内的行为方式相同,如果流已经位于相应的writeExternal方法写入的数据读取结束,对象将optionaldataexceptions EOF设置为true,该读取将返回1,而原始的阅读会把eofexceptions。请注意,此行为不坚持用老ObjectStreamConstants.PROTOCOL_VERSION_1
协议流,其中通过writeExternal方法写入的数据到底是不是清楚,因此无法检测。
的readobjectnodata方法负责初始化对象的状态的特定类型的事件,序列化流不列出给定类的父类被反序列化的对象。这可能的情况下,接受方使用不同版本的反序列化实例的类比发送方和接收器的版本出现,延伸是不是由发送者的版本扩展的类。这也可能如果序列化流已被篡改的发生;因此,readobjectnodata用于初始化反序列化对象尽管“敌意”或不完整的源与流。
序列化不读取或赋值给任何对象,没有实现java.io.serializable接口等。那是不可序列化对象的子类可以被序列化。在这种情况下,不可序列化的类必须有一个无参数构造函数允许字段被初始化。在这种情况下,它的子类来保存和恢复的非序列化类的国家责任。它经常是这样的情况下,该类的字段是可访问的(公共,包或保护),或有得到和设置方法,可以用来恢复状态。
当反序列化对象将被对象输入流和中止阅读过程中的任何异常。
实现Externalizable接口允许对象的假设和对象的序列化格式的内容完全控制。Externalizable接口的方法,readexternal writeExternal和,被称为保存和恢复对象的状态。由类实现时他们可以编写和使用所有的objectoutput和objectinput方法读自己的状态。它是对象的责任来处理出现的任何版本。
枚举常量是不同于普通反序列化序列化或外部对象。一个枚举常量的序列化形式由其名称;的恒值不能被发送。反序列化一个枚举常量,对象输入流从流中读取常数名称;反序列化的常数,然后通过与枚举常量的基本类型和接收常数的名称作为参数调用静态方法Enum.valueOf(Class, String)
获得。像其他序列化或外部对象,枚举常量可以作为反向引用的出现,随后在序列化流目标。通过枚举常数反序列化无法自定义过程:任何特定类的readObject,readobjectnodata,和枚举类型定义的实例方法被忽略在反序列化期间。同样,任何serialpersistentfields serialVersionUID字段声明或忽视了所有枚举类型有一个固定的serialVersionUID 0L。
DataInput
,
ObjectOutputStream
,
Serializable
,
Object Serialization Specification, Section 3, Object Input Classes
Modifier and Type | Class and Description |
---|---|
static class |
ObjectInputStream.GetField
提供对从输入流读取的持久字段的访问。
|
baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
Modifier | Constructor and Description |
---|---|
protected |
ObjectInputStream()
为子类,完全重新实现了ObjectInPutStream没有分配私有数据只是用于实现对象输入流的方式。
|
|
ObjectInputStream(InputStream in)
创建一个对象输入流读取从指定的输入流。
|
Modifier and Type | Method and Description |
---|---|
int |
available()
返回可以不阻塞读取的字节数。
|
void |
close()
关闭输入流。
|
void |
defaultReadObject()
从该流中读取当前类的非静态和非瞬态字段。
|
protected boolean |
enableResolveObject(boolean enable)
使流能够允许从流中读取的对象被替换。
|
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()
从对象输入流对象。
|
protected Object |
readObjectOverride()
这种方法被称为对象,通过构建保护对象使用无参数构造函数受信任的子类。
|
short |
readShort()
读一个16位的短。
|
protected void |
readStreamHeader()
的readstreamheader方法是提供让子类来读取和验证自己的流头。
|
Object |
readUnshared()
读取对象输入流“独享”的对象。
|
int |
readUnsignedByte()
读取一个无符号的8位字节。
|
int |
readUnsignedShort()
读取一个无符号的16位短。
|
String |
readUTF()
读
modified UTF-8格式字符串。
|
void |
registerValidation(ObjectInputValidation obj, int prio)
在返回图形之前注册一个要验证的对象。
|
protected 类<?> |
resolveClass(ObjectStreamClass desc)
加载指定的流类描述的本地类等价。
|
protected Object |
resolveObject(Object obj)
这种方法将允许受信任的子类对象输入流用另一个来代替在反序列化期间。
|
protected 类<?> |
resolveProxyClass(String[] interfaces)
返回实现代理类描述符中命名的接口的代理类;子类可以实现此方法从流中读取自定义数据以及动态代理类的描述符,从而允许它们使用接口和代理类的替代加载机制。
|
int |
skipBytes(int len)
跳过的字节。
|
mark, markSupported, read, reset, skip
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
read, skip
public ObjectInputStream(InputStream in) throws IOException
如果安装了安全管理器,该构造函数将检查“enablesubclassimplementation”时,直接或间接地通过调用子类覆盖objectinputstream.readfields objectinputstream.readunshared方法或构造函数serializablepermission。
in
输入流读取
StreamCorruptedException
如果流头是不正确的
IOException
流头发生I/O错误
SecurityException
非法安全敏感的方法
null
in
NullPointerException
ObjectInputStream()
,
readFields()
,
ObjectOutputStream.ObjectOutputStream(OutputStream)
protected ObjectInputStream() throws IOException, SecurityException
如果存在安全管理器安装,这种方法首先调用与SerializablePermission("enableSubclassImplementation")
权限安全管理的checkPermission
方法保证可以使子类化。
SecurityException
-如果存在一个安全管理及其
checkPermission
否认使子类化方法。
IOException
-如果在创建此流发生I/O错误
SecurityManager.checkPermission(java.security.Permission)
,
SerializablePermission
public final Object readObject() throws IOException, ClassNotFoundException
当所有的字段和它引用的对象完全恢复时,根对象完全恢复了。在这一点上验证回调对象依次执行基于注册的优先权。回调函数是注册的对象(在readObject方法)为他们单独恢复。
异常抛出的问题和用InputStream类不应该被反序列化。所有的异常都是致命的InputStream和离开它在一个不确定的状态;它是由调用者忽略或恢复流的状态。
readObject
接口
ObjectInput
ClassNotFoundException
-序列化对象的类不能被发现。
InvalidClassException
-什么是一个用于序列化类错。
StreamCorruptedException
-流中的控制信息不一致。
OptionalDataException
原始数据而不是对象的流。
IOException
-任何常见的输入/输出相关异常。
protected Object readObjectOverride() throws IOException, ClassNotFoundException
ClassNotFoundException
-序列化对象的类定义,不能被发现。
OptionalDataException
原始数据而不是对象的流。
IOException
如果I/O而从底层流读取时发生错误
ObjectInputStream()
,
readObject()
public Object readUnshared() throws IOException, ClassNotFoundException
对象输入流的子类重写此方法只能在安全领域中具有“enablesubclassimplementation”serializablepermission构造;任何试图实例化子类无此权限会导致引发SecurityException。
ClassNotFoundException
-如果一个类对象反序列化无法找到
StreamCorruptedException
-如果在流控制信息不一致
ObjectStreamException
如果对象反序列化已经出现在流
OptionalDataException
如果原始数据是下一个流
IOException
-如果在反序列化期间发生I/O错误
public void defaultReadObject() throws IOException, ClassNotFoundException
ClassNotFoundException
如果序列化对象的类不能被发现。
IOException
如果I/O错误发生。
NotActiveException
如果流不阅读对象。
public ObjectInputStream.GetField readFields() throws IOException, ClassNotFoundException
GetField
对象
ClassNotFoundException
如果序列化对象的类不能被发现。
IOException
如果I/O错误发生。
NotActiveException
如果流不阅读对象。
public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectException
obj
-对象接收验证回调。
prio
控制回调的顺序;零是一个很好的默认。使用更高的数字被称为早,为以后的回调数较低。在一个优先级,回调是在没有特定的顺序处理。
NotActiveException
-流不是当前阅读的对象是登记一个回调无效。
InvalidObjectException
-验证对象是无效的。
protected 类<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException
在ObjectOutputStream
对应的方法是annotateClass
。此方法将只为流中的每一个唯一类调用一次。该方法可以实现子类使用不同的加载机制,但必须返回一个类
对象。一旦返回,如果类没有数组类,它是相对于serialVersionUID的序列化类的serialVersionUID,如果有一个错配,反序列化失败和InvalidClassException
抛出。
在ObjectInputStream
此方法的默认实现调用的返回结果
类。forName(描述getname()、虚假、装载机)哪里
loader
决定如下:如果有一个在当前线程的堆栈的声明类的自定义类装载器定义的方法(而不是生成实现反射调用),然后
loader
是类装载器对应到最近的这种方法目前执行框架;否则,
loader
是
null
。如果这个调用的结果在
ClassNotFoundException
和过去的
ObjectStreamClass
实例的名称是一个原始的类型或无效的java语言的关键字,然后
类
对象表示简单类型或无效将返回(例如,与一名
"int"
ObjectStreamClass
将解决
Integer.TYPE
)。否则,该
ClassNotFoundException
就会抛给方法的调用者。
desc
-
ObjectStreamClass
类实例
desc
类
对象对应一个
IOException
-任何常见的输入/输出异常。
ClassNotFoundException
如果序列化对象的类不能被发现。
protected 类<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException
这种方法在流中的每一个唯一的代理类描述符被调用一次。
在ObjectOutputStream
对应的方法是annotateProxyClass
。对于一个给定的ObjectInputStream
重写此方法的子类,在子类ObjectOutputStream
相应的annotateProxyClass
方法必须写任何数据或对象的读取方法。
在ObjectInputStream
此方法的默认实现返回的,在interfaces
参数命名的接口调用Proxy.getProxyClass
类
对象列表的结果。每个接口的名称i
类
对象是通过调用的返回值
类。(我,假,forName装载机)哪里
loader
是第一个非
null
类装载器的执行堆栈,或
null
如果没有非
null
类装载器是在栈上(由
resolveClass
方法使用相同的类装载器的选择)。除非解决接口是非公开的,同样的价值
loader
也传递给
Proxy.getProxyClass
类装载器;如果非公开的接口的存在,它们的类加载器通过相反(如果遇到多个非公开接口的类装载器是一个
IllegalAccessError
抛出)。如果
Proxy.getProxyClass
抛出一个
IllegalArgumentException
,
resolveProxyClass
将
ClassNotFoundException
含有
IllegalArgumentException
。
interfaces
-接口名称进行反序列化代理类中的描述符列表
IOException
任何例外的基本
InputStream
扔
ClassNotFoundException
如果代理类或任何指定的接口不能被发现
ObjectOutputStream.annotateProxyClass(Class)
protected Object resolveObject(Object obj) throws IOException
这种方法是在对象已读但之前返回从readObject叫。默认resolveobject方法只返回相同的对象。
当一个子类替换对象时,它必须确保被替换的对象与所存储的引用的每个字段都是兼容的。类型不是字段或数组元素的类型的子类的对象通过引发异常中止序列化,而对象是不被存储的。
此方法仅在第一次遇到每个对象时调用一次。所有后续对该对象的引用将被重定向到新的对象。
obj
对象被取代
IOException
-任何常见的输入/输出异常。
protected boolean enableResolveObject(boolean enable) throws SecurityException
如果使可能是真实的,并有一个安全管理安装,这种方法首先调用与SerializablePermission("enableSubstitution")
权限安全管理的checkPermission
方法保证可以使流允许对象从流中读取被取代。
enable
真正使每个对象反序列化的
resolveObject
使用
SecurityException
-如果存在一个安全管理及其
checkPermission
方法拒绝使流允许对象从流中读取被取代。
SecurityManager.checkPermission(java.security.Permission)
,
SerializablePermission
protected void readStreamHeader() throws IOException, StreamCorruptedException
IOException
-如果有I/O而从底层
InputStream
读数误差
StreamCorruptedException
-如果在流控制信息不一致
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException
writeClassDescriptor
)。默认情况下,该方法根据对象序列化规范中定义的格式读取类描述符。
IOException
如果发生I/O错误。
ClassNotFoundException
如果序列化对象的类中使用的描述符表示的类不能找到
ObjectOutputStream.writeClassDescriptor(java.io.ObjectStreamClass)
public int read() throws IOException
read
接口
ObjectInput
read
方法重写,继承类
InputStream
IOException
如果发生I/O错误。
public int read(byte[] buf, int off, int len) throws IOException
read
接口
ObjectInput
read
方法重写,继承类
InputStream
buf
-缓冲区中读取数据
off
的起始偏移量的数据
len
-的最大字节数读
IOException
如果发生I/O错误。
DataInputStream.readFully(byte[],int,int)
public int available() throws IOException
available
接口
ObjectInput
available
方法重写,继承类
InputStream
IOException
-如果有I/O而从底层
InputStream
读数误差
public void close() throws IOException
close
接口
Closeable
close
接口
ObjectInput
close
接口
AutoCloseable
close
方法重写,继承类
InputStream
IOException
如果发生I/O错误。
public boolean readBoolean() throws IOException
readBoolean
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public byte readByte() throws IOException
readByte
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public int readUnsignedByte() throws IOException
readUnsignedByte
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public char readChar() throws IOException
readChar
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public short readShort() throws IOException
readShort
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public int readUnsignedShort() throws IOException
readUnsignedShort
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public int readInt() throws IOException
readInt
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public long readLong() throws IOException
readLong
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public float readFloat() throws IOException
readFloat
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public double readDouble() throws IOException
readDouble
接口
DataInput
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public void readFully(byte[] buf) throws IOException
readFully
接口
DataInput
buf
-缓冲区中读取数据
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public void readFully(byte[] buf, int off, int len) throws IOException
readFully
接口
DataInput
buf
-缓冲区中读取数据
off
的起始偏移量的数据
len
-的最大字节数读
EOFException
如果文件结束了。
IOException
-如果发生其他I/O错误。
public int skipBytes(int len) throws IOException
skipBytes
接口
DataInput
len
-字节数被跳过
IOException
如果发生I/O错误。
@Deprecated public String readLine() throws IOException
readLine
接口
DataInput
IOException
-如果有I/O而从底层
InputStream
读数误差
public String readUTF() throws IOException
readUTF
接口
DataInput
IOException
-如果有I/O而从底层
InputStream
读数误差
UTFDataFormatException
如果读取的字节数不代表一个有效的UTF-8字符串编码的改进
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.