- 所有已实现的接口:
-
Closeable
,DataInput
,ObjectInput
,ObjectStreamConstants
,AutoCloseable
警告:反序列化不受信任的数据本质上是危险的,应该避免使用。不受信任的数据应该根据Java SE的“安全编码准则”部分中的“序列化和反序列化”进行仔细验证。序列化过滤描述了防御性使用序列化过滤器的最佳实践。
禁用反序列化攻击的关键是防止对任意类的实例进行反序列化,从而防止直接或间接执行它们的方法。ObjectInputFilter描述了如何使用过滤器,ObjectInputFilter.Config描述了如何配置过滤器和过滤器工厂。每个流都有一个可选的反序列化过滤器,用于在反序列化过程中检查类和资源限制。JVM范围的过滤器工厂确保可以在每个ObjectInputStream上设置过滤器,并且可以检查从流中读取的每个对象。ObjectInputStream构造函数调用过滤器工厂以选择初始过滤器,该过滤器可以通过setObjectInputFilter(java.io.ObjectInputFilter)进行更新或替换。
如果ObjectInputStream具有过滤器,则ObjectInputFilter可以检查流中允许的类、数组长度、流中的引用数量、深度和从输入流中消耗的字节数,如果不允许,则可以终止反序列化。
ObjectOutputStream和ObjectInputStream在与FileOutputStream和FileInputStream一起使用时,可以为对象图提供持久存储。ObjectInputStream用于恢复先前序列化的对象。其他用途包括使用套接字流在主机之间传递对象或在远程通信系统中对参数进行编组和解组。
ObjectInputStream确保从流创建的对象图中所有对象的类型与Java虚拟机中存在的类匹配。类将根据需要使用标准机制进行加载。
只有支持java.io.Serializable或java.io.Externalizable接口的对象才可以从流中读取。
方法readObject用于从流中读取对象。应使用Java的安全转换来获取所需的类型。在Java中,字符串和数组都是对象,并且在序列化期间被视为对象。在读取时,它们需要被转换为预期的类型。
可以使用DataInput上的适当方法从流中读取原始数据类型。
对象的默认反序列化机制将每个字段的内容恢复为写入时的值和类型。声明为transient或static的字段将被反序列化过程忽略。对其他对象的引用将导致必要时从流中读取这些对象。使用引用共享机制正确恢复对象图。在反序列化时总是分配新对象,这可以防止现有对象被覆盖。
读取对象类似于运行新对象的构造函数。为对象分配内存并将其初始化为零(NULL)。对于非可序列化类,将调用无参数构造函数,然后从流中恢复可序列化类的字段,从java.lang.object最接近的可序列化类开始,直到对象的最具体类结束。
例如,要从由ObjectOutputStream中的示例写入的流中读取:
try (FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis)) {
String label = (String) ois.readObject();
LocalDateTime dateTime = (LocalDateTime) ois.readObject();
// 使用label和dateTime
} catch (Exception ex) {
// 处理异常
}
类通过实现java.io.Serializable或java.io.Externalizable接口来控制它们的序列化方式。
实现Serializable接口允许对象序列化保存和恢复对象的整个状态,并允许类在写入流和读取流之间发生演变。它会自动遍历对象之间的引用,保存和恢复整个图形。
在序列化和反序列化过程中需要特殊处理的可序列化类应实现具有以下签名的方法:
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
方法名称、修饰符、返回类型以及参数的数量和类型必须完全匹配,才能使方法被序列化或反序列化使用。这些方法应该只声明抛出与这些签名一致的已检查异常。
readObject方法负责使用由相应writeObject方法写入流的数据来读取和恢复对象的状态。该方法不需要关心属于其超类或子类的状态。通过从ObjectInputStream读取各个字段的数据并将其分配给对象的适当字段来恢复状态。DataInput支持读取原始数据类型。
任何尝试读取超出由相应writeObject方法写入的自定义数据边界的对象数据都将导致抛出OptionalDataException,eof字段值为true。超出分配数据结尾的非对象读取将反映数据的结束方式,就像它们指示流的结束一样:按字节读取将返回-1作为读取的字节或字节数,原始读取将抛出EOFExceptions。如果没有相应的writeObject方法,则默认序列化数据的结束标记将标记分配数据的结束。
从readExternal方法中发出的原始和对象读取调用行为相同--如果流已定位到由相应writeExternal方法写入的数据末尾,则对象读取将抛出eof设置为true的OptionalDataExceptions,按字节读取将返回-1,原始读取将抛出EOFExceptions。请注意,此行为不适用于使用旧的ObjectStreamConstants.PROTOCOL_VERSION_1协议编写的流,在该协议中,由writeExternal方法写入的数据的末尾没有被标记,因此无法检测到。
readObjectNoData方法负责在序列化流中不将给定类列为正在反序列化的对象的超类时,为该类的特定类初始化对象的状态。这可能发生在接收方使用与发送方不同版本的反序列化实例类的情况下,并且接收方的版本扩展了发送方版本未扩展的类。如果序列化流被篡改,则readObjectNoData对于正确初始化反序列化对象非常有用。
序列化不会读取或为未实现java.io.Serializable接口的任何对象的字段分配值。未序列化的对象的子类可以是可序列化的。在这种情况下,非可序列化类必须具有无参数构造函数,以允许初始化其字段。在这种情况下,子类有责任保存和恢复非可序列化类的状态。通常情况下,该类的字段是可访问的(public、package或protected),或者有可用于恢复状态的get和set方法。
在反序列化对象时发生的任何异常都将被ObjectInputStream捕获并中止读取过程。
实现Externalizable接口允许对象完全控制对象序列化形式的内容和格式。Externalizable接口的writeExternal和readExternal方法被调用以保存和恢复对象的状态。当类实现时,它们可以使用ObjectOutput和ObjectInput的所有方法来写入和读取自己的状态。对象有责任处理发生的任何版本更改。
枚举常量的反序列化方式与普通可序列化或可外部化对象不同。枚举常量的序列化形式仅包含其名称;常量的字段值不会传输。要反序列化枚举常量,ObjectInputStream从流中读取常量名称;然后通过调用Enum.valueOf(Class, String)静态方法,使用枚举常量的基本类型和接收到的常量名称作为参数来获取反序列化的常量。与其他可序列化或可外部化对象一样,枚举常量可以作为后续出现在序列化流中的反向引用的目标。枚举常量的反序列化过程无法定制:在反序列化过程中,枚举类型定义的任何特定于类的readObject、readObjectNoData和readResolve方法都将被忽略。同样,任何serialPersistentFields或serialVersionUID字段声明也将被忽略--所有枚举类型都具有固定的serialVersionUID为0L。
记录的序列化方式与普通可序列化或可外部化对象不同。在反序列化期间,将调用记录的规范构造函数来构造记录对象。对于可序列化记录,将忽略某些与序列化相关的方法,例如readObject和writeObject。有关可序列化记录的更多信息,请参阅Java对象序列化规范,第1.13节“记录序列化”。
- 自从:
- 1.1
- 外部规范
- 参见:
-
Nested Class Summary
-
Field Summary
Fields declared in interface java.io.ObjectStreamConstants
baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, SERIAL_FILTER_PERMISSION, 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
-
Constructor Summary
ModifierConstructorDescriptionprotected
为完全重新实现ObjectInputStream的子类提供一种方式,使其不必分配仅由此ObjectInputStream实现使用的私有数据。创建一个从指定InputStream读取的ObjectInputStream。 -
Method Summary
Modifier and TypeMethodDescriptionint
返回可以无阻塞地读取的字节数。void
close()
关闭此输入流并释放与流相关的任何系统资源。void
从此流中读取当前类的非静态和非瞬态字段。protected boolean
enableResolveObject
(boolean enable) 使流能够替换从流中读取的对象。final ObjectInputFilter
返回此流的反序列化过滤器。int
read()
读取一个字节的数据。int
read
(byte[] buf, int off, int len) 读取到一个字节数组中。boolean
读取一个布尔值。byte
readByte()
读取一个8位字节。char
readChar()
读取一个16位字符。protected ObjectStreamClass
从序列化流中读取一个类描述符。double
读取一个64位双精度浮点数。从流中读取持久字段,并通过名称使它们可用。float
读取一个32位浮点数。void
readFully
(byte[] buf) 读取字节,直到所有字节都被读取为止。void
readFully
(byte[] buf, int off, int len) 读取字节,直到所有字节都被读取为止。int
readInt()
读取一个32位整数。readLine()
已弃用。此方法未正确将字节转换为字符。long
readLong()
读取一个64位长整型。final Object
从ObjectInputStream中读取一个对象。protected Object
此方法由ObjectInputStream的受信任子类调用,这些子类使用受保护的无参构造函数构造ObjectInputStream。short
读取一个16位短整型。protected void
提供readStreamHeader方法,允许子类读取和验证自己的流头。从ObjectInputStream中读取一个“非共享”对象。int
读取一个无符号的8位字节。int
读取一个无符号的16位短整型。readUTF()
以修改后的UTF-8格式读取一个字符串。void
registerValidation
(ObjectInputValidation obj, int prio) 在返回图形之前注册要验证的对象。protected Class
<?> 加载指定流类描述的本地类等效。protected Object
resolveObject
(Object obj) 此方法将允许ObjectInputStream的受信任子类在反序列化过程中替换一个对象为另一个对象。protected Class
<?> resolveProxyClass
(String[] interfaces) 返回一个代理类,该代理类实现了代理类描述符中命名的接口;子类可以实现此方法以从流中读取动态代理类的描述符以及自定义数据,从而允许它们使用替代的加载机制来加载接口和代理类。final void
为流设置反序列化过滤器。int
skipBytes
(int len) 跳过字节。Methods declared in class java.io.InputStream
mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, transferTo
Methods declared in class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods declared in interface java.io.ObjectInput
read, skip
-
Constructor Details
-
ObjectInputStream
创建一个从指定InputStream读取的ObjectInputStream。从流中读取并验证序列化流头。此构造函数将阻塞,直到相应的ObjectOutputStream已写入并刷新了头部。构造函数将反序列化过滤器初始化为通过调用从
ObjectInputFilter.Config.getSerialFilterFactory()
返回的序列化过滤器工厂返回的过滤器,对于当前过滤器为null
,对于请求的过滤器为静态JVM范围过滤器。如果序列化过滤器或序列化过滤器工厂属性无效,则会抛出IllegalStateException
。当调用过滤器工厂的apply
方法时,可能会抛出运行时异常,从而阻止构造ObjectInputStream
。如果安装了安全管理器,则此构造函数在直接或间接由覆盖ObjectInputStream.readFields或ObjectInputStream.readUnshared方法的子类的构造函数调用时,将检查“enableSubclassImplementation”SerializablePermission。
- 参数:
-
in
- 要从中读取的输入流 - 抛出:
-
StreamCorruptedException
- 如果流头不正确 -
IOException
- 在读取流头时发生I/O错误 -
SecurityException
- 如果不受信任的子类非法地覆盖了安全敏感方法 -
IllegalStateException
- 如果由于无效的序列化过滤器或序列化过滤器工厂属性的初始化失败而导致ObjectInputFilter.Config
的初始化失败。 -
NullPointerException
- 如果in
为null
- 参见:
-
ObjectInputStream
为完全重新实现ObjectInputStream的子类提供一种方式,使其不必分配仅由此ObjectInputStream实现使用的私有数据。构造函数将反序列化过滤器初始化为通过调用从
ObjectInputFilter.Config.getSerialFilterFactory()
返回的序列化过滤器工厂返回的过滤器,对于当前过滤器为null
,对于请求的过滤器为静态JVM范围过滤器。如果序列化过滤器或序列化过滤器工厂属性无效,则会抛出IllegalStateException
。当调用过滤器工厂的apply
方法时,可能会抛出运行时异常,从而阻止构造ObjectInputStream
。如果安装了安全管理器,则此方法首先调用安全管理器的
checkPermission
方法,使用SerializablePermission("enableSubclassImplementation")
权限来确保启用子类化是安全的。- 抛出:
-
SecurityException
- 如果存在安全管理器且其checkPermission
方法拒绝启用子类化。 -
IOException
- 在创建此流时发生I/O错误 -
IllegalStateException
- 如果由于无效的序列化过滤器或序列化过滤器工厂属性的初始化失败而导致ObjectInputFilter.Config
的初始化失败。 - 参见:
-
-
Method Details
-
readObject
从ObjectInputStream中读取一个对象。读取对象的类、类的签名以及类的非瞬态和非静态字段的值。可以使用writeObject和readObject方法覆盖类的默认反序列化。此对象引用的对象会被递归读取,以便通过readObject重建对象的完整等效图。当所有字段及其引用的对象完全恢复时,根对象将完全恢复。此时,根据其注册的优先级顺序执行对象验证回调。这些回调由对象(在readObject特殊方法中)在它们被逐个恢复时注册。
当反序列化过滤器不为
null
时,将为每个读取的对象(常规或类)调用它以重建根对象。有关详细信息,请参见setObjectInputFilter
。对于InputStream的问题和不应反序列化的类,将抛出异常。所有异常对InputStream都是致命的,并使其处于不确定状态;调用者需要忽略或恢复流状态。
- 指定者:
-
readObject
在接口ObjectInput
中 - 返回值:
- 从流中读取的对象
- 抛出:
-
ClassNotFoundException
- 无法找到序列化对象的类。 -
InvalidClassException
- 反序列化时使用的类出现问题。 -
StreamCorruptedException
- 流中的控制信息不一致。 -
OptionalDataException
- 流中发现原始数据而不是对象。 -
IOException
- 任何常见的输入/输出相关异常。
-
readObjectOverride
该方法由ObjectInputStream的受信任子类调用,该子类使用受保护的无参数构造函数构造ObjectInputStream。预期子类提供一个带有修饰符"final"的重写方法。- 返回值:
- 从流中读取的对象。
- 抛出:
-
ClassNotFoundException
- 无法找到序列化对象的类定义。 -
OptionalDataException
- 流中发现原始数据而不是对象。 -
IOException
- 从底层流读取时发生I/O错误 - 自从:
- 1.2
- 参见:
-
defaultReadObject
从流中读取当前类的非静态和非瞬态字段。只能从正在反序列化的类的readObject方法中调用此方法。否则,如果调用它,将抛出NotActiveException。- 抛出:
-
ClassNotFoundException
- 如果无法找到序列化对象的类。 -
IOException
- 如果发生I/O错误。 -
NotActiveException
- 如果流当前未读取对象。
-
readFields
从流中读取持久字段,并按名称使其可用。- 返回值:
-
表示正在反序列化的对象的持久字段的
GetField
对象 - 抛出:
-
ClassNotFoundException
- 如果无法找到序列化对象的类。 -
IOException
- 如果发生I/O错误。 -
NotActiveException
- 如果流当前未读取对象。 - 自从:
- 1.2
-
registerValidation
public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectException 在返回图形之前注册要验证的对象。虽然类似于resolveObject,但这些验证是在整个图形重新构建后调用的。通常,readObject方法将对象注册到流中,以便在所有对象都恢复后执行一组最终验证。- 参数:
-
obj
- 要接收验证回调的对象。 -
prio
- 控制回调的顺序;零是一个很好的默认值。使用更高的数字可以更早地回调,使用较低的数字可以进行较晚的回调。在优先级内,回调以无特定顺序处理。 - 抛出:
-
NotActiveException
- 流当前未读取对象,因此注册回调无效。 -
InvalidObjectException
- 验证对象为null。
-
resolveClass
加载指定流类描述的本地类等效项。子类可以实现此方法以允许从替代源获取类。ObjectOutputStream中的对应方法是annotateClass。此方法仅对流中的每个唯一类调用一次。子类可以实现此方法以使用替代加载机制,但必须返回一个Class对象。一旦返回,如果类不是数组类,则其serialVersionUID将与序列化类的serialVersionUID进行比较,如果不匹配,则反序列化失败,并且将抛出InvalidClassException。
ObjectInputStream中此方法的默认实现返回调用结果
Class.forName(desc.getName(), false, loader)
- 参数:
-
desc
- ObjectStreamClass类的实例 - 返回值:
-
与
desc
对应的Class对象 - 抛出:
-
IOException
- 任何常见的输入/输出异常。 -
ClassNotFoundException
- 如果无法找到序列化对象的类。
-
resolveProxyClass
protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException 返回一个代理类,该类实现了代理类描述符中命名的接口;子类可以实现此方法以从流中读取自定义数据以及动态代理类的描述符,从而允许它们使用替代加载机制来加载接口和代理类。对于流中的每个唯一代理类描述符,将精确调用此方法一次。
ObjectOutputStream
中对应的方法是annotateProxyClass
。对于覆盖此方法的ObjectInputStream
的给定子类,对应的ObjectOutputStream
的annotateProxyClass
方法必须写入此方法读取的任何数据或对象。ObjectInputStream
中此方法的默认实现返回使用interfaces
参数中命名的接口的Class
对象列表调用Proxy.getProxyClass
的结果。每个接口名称i
的Class
对象是通过调用返回的值Class.forName(i, false, loader)
loader
是当前线程堆栈上的第一个类加载器(从当前执行的方法开始),既不是平台类加载器也不是其祖先;否则,loader
是平台类加载器。除非解析的接口中有非公共接口,否则loader
的这个相同值也是传递给Proxy.getProxyClass
的类加载器;如果存在非公共接口,则传递它们的类加载器(如果遇到多个非公共接口类加载器,则会抛出IllegalAccessError
)。如果Proxy.getProxyClass
抛出IllegalArgumentException
,resolveProxyClass
将抛出包含IllegalArgumentException
的ClassNotFoundException
。- 参数:
-
interfaces
- 在代理类描述符中反序列化的接口名称列表 - 返回:
- 指定接口的代理类
- 抛出:
-
IOException
- 由底层InputStream
抛出的任何异常 -
ClassNotFoundException
- 如果找不到代理类或任何命名的接口 - 自:
- 1.3
- 参见:
-
resolveObject
此方法将允许ObjectInputStream的受信任子类在反序列化期间替换一个对象为另一个对象。替换对象在调用enableResolveObject之前被禁用。enableResolveObject方法检查请求解析对象的流是否可信任。将可序列化对象的每个引用传递给resolveObject。为确保对象的私有状态不被意外暴露,只有受信任的流可以使用resolveObject。此方法在读取对象后但在从readObject返回之前调用。默认的resolveObject方法只是返回相同的对象。
当子类替换对象时,必须确保替换的对象与引用将被存储的每个字段兼容。类型不是字段类型或数组元素类型的子类的对象通过引发异常中止反序列化,并且对象不会被存储。
此方法仅在首次遇到每个对象时调用。所有后续对该对象的引用将重定向到新对象。
- 参数:
-
obj
- 要替换的对象 - 返回:
- 替换的对象
- 抛出:
-
IOException
- 任何常规的输入/输出异常
-
enableResolveObject
启用流以替换从流中读取的对象。启用后,将为正在反序列化的每个对象调用resolveObject(java.lang.Object)
方法。如果当前未启用对象替换,并且
enable
为true,并且已安装安全管理器,则此方法首先调用安全管理器的checkPermission
方法,以SerializablePermission("enableSubstitution")
权限确保调用者被允许启用流以替换从流中读取的对象。- 参数:
-
enable
- 为每个正在反序列化的对象启用resolveObject
的使用 - 返回:
- 在调用此方法之前的先前设置
- 抛出:
-
SecurityException
- 如果存在安全管理器且其checkPermission
方法拒绝启用流以替换从流中读取的对象。 - 参见:
-
readStreamHeader
提供readStreamHeader方法以允许子类读取和验证自己的流头。它读取并验证魔数和版本号。- 抛出:
-
IOException
- 如果从底层InputStream
读取时发生I/O错误 -
StreamCorruptedException
- 如果流中的控制信息不一致
-
readClassDescriptor
从序列化流中读取类描述符。当ObjectInputStream期望类描述符作为序列化流中的下一个项时,将调用此方法。ObjectInputStream的子类可以覆盖此方法,以读取以非标准格式编写的类描述符(由覆盖writeClassDescriptor
方法的ObjectOutputStream的子类编写)。默认情况下,此方法根据对象序列化规范中定义的格式读取类描述符。- 返回:
- 读取的类描述符
- 抛出:
-
IOException
- 如果发生I/O错误。 -
ClassNotFoundException
- 如果在类描述符表示中使用的序列化对象的类找不到 - 自:
- 1.3
- 参见:
-
read
读取一个字节的数据。如果没有可用的输入,此方法将阻塞。- 在接口中指定:
-
read
在接口ObjectInput
中 - 在类中指定:
-
read
在类InputStream
中 - 返回:
- 读取的字节,如果达到流的末尾则为-1。
- 抛出:
-
IOException
- 如果发生I/O错误。
-
read
读取到字节数组中。此方法将阻塞,直到有一些输入可用。考虑使用java.io.DataInputStream.readFully来精确读取'length'字节。- 在接口中指定:
-
read
在接口ObjectInput
中 - 在类中覆盖:
-
read
在类InputStream
中 - 参数:
-
buf
- 读取数据的目标数组 -
off
- 目标数组buf
中的起始偏移量 -
len
- 要读取的最大字节数 - 返回:
-
读入缓冲区的总字节数,如果没有更多数据因为已达到流的末尾,则为
-1
。 - 抛出:
-
NullPointerException
- 如果buf
为null
。 -
IndexOutOfBoundsException
- 如果off
为负,len
为负,或len
大于buf.length - off
。 -
IOException
- 如果发生I/O错误。 - 参见:
-
available
返回可以读取而不阻塞的字节数。- 在接口中指定:
-
available
在接口ObjectInput
中 - 在类中覆盖:
-
available
在类InputStream
中 - 返回:
- 可用字节数。
- 抛出:
-
IOException
- 如果从底层InputStream
读取时发生I/O错误
-
close
关闭此输入流并释放与流关联的任何系统资源。- 指定者:
-
close
在接口AutoCloseable
中 - 指定者:
-
close
在接口Closeable
中 - 指定者:
-
close
在接口ObjectInput
中 - 覆盖:
-
close
在类InputStream
中 - 抛出:
-
IOException
- 如果发生I/O错误。
-
readBoolean
读取一个布尔值。- 指定者:
-
readBoolean
在接口DataInput
中 - 返回:
- 读取的布尔值。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readByte
读取一个8位字节。- 指定者:
-
readByte
在接口DataInput
中 - 返回:
- 读取的8位字节。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readUnsignedByte
读取一个无符号的8位字节。- 指定者:
-
readUnsignedByte
在接口DataInput
中 - 返回:
- 读取的8位字节。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readChar
读取一个16位字符。- 指定者:
-
readChar
在接口DataInput
中 - 返回:
- 读取的16位字符。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readShort
读取一个16位短整型数。- 指定者:
-
readShort
在接口DataInput
中 - 返回:
- 读取的16位短整型数。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readUnsignedShort
读取一个无符号的16位短整型数。- 指定者:
-
readUnsignedShort
在接口DataInput
中 - 返回:
- 读取的16位短整型数。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readInt
读取一个32位整型数。- 指定者:
-
readInt
在接口DataInput
中 - 返回:
- 读取的32位整数。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readLong
读取一个64位长整型数。- 指定者:
-
readLong
在接口DataInput
中 - 返回:
- 读取的64位长整型数。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readFloat
读取一个32位浮点数。- 指定者:
-
readFloat
在接口DataInput
中 - 返回:
- 读取的32位浮点数。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readDouble
读取一个64位双精度浮点数。- 指定者:
-
readDouble
在接口DataInput
中 - 返回:
- 读取的64位双精度浮点数。
- 抛出:
-
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readFully
读取字节,阻塞直到所有字节都被读取。- 指定者:
-
readFully
在接口DataInput
中 - 参数:
-
buf
- 读取数据的缓冲区 - 抛出:
-
NullPointerException
- 如果buf
为null
。 -
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
readFully
读取字节,阻塞直到所有字节都被读取。- 指定者:
-
readFully
在接口DataInput
中 - 参数:
-
buf
- 读取数据的缓冲区 -
off
- 数据数组buf
的起始偏移量 -
len
- 要读取的最大字节数 - 抛出:
-
NullPointerException
- 如果buf
为null
。 -
IndexOutOfBoundsException
- 如果off
为负数,len
为负数,或len
大于buf.length - off
。 -
EOFException
- 如果到达文件末尾。 -
IOException
- 如果发生其他I/O错误。
-
skipBytes
跳过字节。- 指定者:
-
skipBytes
在接口DataInput
中 - 参数:
-
len
- 要跳过的字节数 - 返回:
- 实际跳过的字节数。
- 抛出:
-
IOException
- 如果发生I/O错误。
-
readLine
Deprecated.This method does not properly convert bytes to characters. see DataInputStream for the details and alternatives.读取以\n、\r、\r\n或EOF终止的行。- 指定者:
-
readLine
在接口DataInput
中 - 返回:
- 行的字符串副本。
- 抛出:
-
IOException
- 如果从底层InputStream
读取时发生I/O错误
-
readUTF
读取以修改后的UTF-8格式的字符串。- 指定者:
-
readUTF
在接口DataInput
中 - 返回:
- 字符串。
- 抛出:
-
IOException
- 如果从底层InputStream
读取时发生I/O错误 -
UTFDataFormatException
- 如果读取的字节不表示字符串的有效修改后的UTF-8编码
-
getObjectInputFilter
- 返回:
- 流的反序列化过滤器;可能为null
- 自:
- 9
-
setObjectInputFilter
设置流的反序列化过滤器。反序列化过滤器设置为通过使用JVM范围的过滤器工厂和当前过滤器以及filter
参数调用返回的过滤器。当前过滤器是在ObjectInputStream构造函数中通过调用JVM范围的过滤器工厂设置的,可能为null
。setObjectInputFilter(ObjectInputFilter)此方法只能在从流中读取任何对象之前调用一次,并且只能调用一次;例如,通过调用readObject()
或readUnshared()
。不允许将
非null
过滤器替换为null
过滤器。如果当前过滤器为非null
,则从过滤器工厂返回的值必须为非null
。过滤器的
checkInput
方法将针对流中的每个类和引用进行调用。过滤器可以检查类的任何或所有内容,数组长度,引用数量,图的深度以及输入流的大小。深度是从正在反序列化的图的根部开始读取并正在反序列化的当前对象开始的嵌套readObject调用的数量。引用数量是已从流中读取的对象和对象引用的累积数量,包括当前正在读取的对象。仅在从流中读取对象时才调用过滤器,而不是对基本类型。如果过滤器返回
Status.REJECTED
,null
或抛出RuntimeException
,则活动的readObject
或readUnshared
将抛出InvalidClassException
,否则反序列化将继续无间断。- 实现要求:
-
当过滤器不为
null
时,在流中的每个对象(常规或类)上调用readObject
和readUnshared
。字符串被视为基本类型,不会调用过滤器。过滤器被调用于:- 先前从流中反序列化的每个对象引用(类为
null
,arrayLength为-1), - 每个常规类(类不为
null
,arrayLength为-1), - 流中显式引用的每个接口类(不会为流中的类实现的接口调用),
- 每个动态代理的接口和动态代理类本身(类不为
null
,arrayLength为-1), - 使用数组类型和数组长度对每个数组进行过滤(类为数组类型,arrayLength为请求的长度),
- 每个由其类的
readResolve
方法替换的对象使用替换对象的类进行过滤,如果不为null
,并且如果是数组,则为数组长度,否则为-1, - 每个由
resolveObject
替换的对象使用替换对象的类进行过滤,如果不为null
,并且如果是数组,则为数组长度,否则为-1。
checkInput
方法时,将访问当前类,数组长度,已从流中读取的当前引用数量,嵌套调用readObject
或readUnshared
的深度,以及从输入流中消耗的实现相关字节数。每次调用
readObject
或readUnshared
在读取对象之前将深度增加1,并在正常返回或异常返回之前减少1。深度从1
开始,并且对于每个嵌套对象都会增加,并在每个嵌套调用返回时减少。流中的引用计数从1
开始,并在读取对象之前增加。 - 先前从流中反序列化的每个对象引用(类为
- 参数:
-
filter
- 过滤器,可能为null - 抛出:
-
SecurityException
- 如果存在安全管理器且未授予SerializablePermission("serialFilter")
-
IllegalStateException
- 如果已读取对象,如果过滤器工厂在当前过滤器为非null时返回null
,或者如果过滤器已经设置。 - 自:
- 9
-