
PipedOutputStream java.lang.Object |—java.io.OutputStream |—|—java.io.PipedOutputStream public class PipedOutputStream extends OutputStream 管道输出流可以连接到管道输入流以创建通信管道。 管道输出流是管道的发送端。 通常,数据由一个线程写入 PipedOutputStream 对象,数据由其他线程从连接的 PipedInputStream 读取。 不建议尝试从单个线程中使用这两个对象,因为它可能会使线程死锁。 如果从连接的管道输入流中读取数据字节的线程不再活动,则称该管道已损坏。 Since: JDK1.0 构造函数摘要 构造函数 描述 PipedOutputStream() 创建尚未连接到管道输入流的管道输出流。 PipedOutputStream(PipedInputStream snk) 创建连接到指定管道输入流的管道输出流。 方法总结 修饰符和类型 方法 描述 void close() 关闭此管道输出流并释放与此流关联的任何系统资源。 void connect(PipedInputStream snk) 将此管道输出流连接到接收器。 void flush() 刷新此输出流并强制写出任何缓冲的输出字节。 void write(byte[] b, int off, int len) 将指定字节数组中的 len 个字节从偏移量 off 处开始写入此管道输出流。 void write(int b) 将指定的字节写入管道输出流。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 从类 java.io.OutputStream 继承的方法 write 构造函数详细信息 PipedOutputStream public PipedOutputStream(PipedInputStream snk) throws IOException 创建连接到指定管道输入流的管道输出流。 写入此流的数据字节将作为 snk 的输入提供。 参数: 参数名称 参数描述 snk 要连接的管道输入流。 Throws: Throw名称 Throw描述 IOException 如果发生 I/O 错误。 PipedOutputStream public PipedOutputStream() 创建尚未连接到管道输入流的管道输出流。 在使用之前,它必须由接收方或发送方连接到管道输入流。 方法详情 connect public void connect(PipedInputStream snk) throws IOException 将此管道输出流连接到接收器。 如果此对象已连接到其他管道输入流,则会引发 IOException。 如果 snk 是未连接的管道输入流并且 src 是未连接的管道输出流,则它们可以通过以下任一调用连接: src.connect(snk) 或调用: snk.connect(src) 这两个调用具有相同的效果。 参数: 参数名称 参数描述 snk 要连接的管道输入流。 Throws: Throw名称 Throw描述 IOException 如果发生 I/O 错误。 write public void write(int b) throws IOException 将指定的字节写入管道输出流。 实现OutputStream的write方法。 指定者:...

PipedInputStream java.lang.Object |—java.io.InputStream |—|—java.io.PipedInputStream public class PipedInputStream extends InputStream 管道输入流应该连接到管道输出流; 然后,管道输入流提供写入管道输出流的任何数据字节。 通常,数据由一个线程从 PipedInputStream 对象读取,数据由其他线程写入相应的 PipedOutputStream。 不建议尝试从单个线程中使用这两个对象,因为它可能会使线程死锁。 管道输入流包含一个缓冲区,在限制范围内将读取操作与写入操作分离。 如果向连接的管道输出流提供数据字节的线程不再活动,则称该管道已损坏。 Since: JDK1.0 字段摘要 修饰符和类型 字段 描述 protected byte[] buffer 放置传入数据的循环缓冲区。 protected int in 当从连接的管道输出流接收时,循环缓冲区中将存储下一个字节数据的位置的索引。 protected int out 此管道输入流将读取下一个数据字节的循环缓冲区中位置的索引。 protected static int PIPE_SIZE 管道的循环输入缓冲区的默认大小。 构造函数摘要 构造函数 描述 PipedInputStream() 创建一个 PipedInputStream 以便它尚未连接。 PipedInputStream(int pipeSize) 创建一个 PipedInputStream 以便它尚未连接并使用指定的管道大小作为管道缓冲区。 PipedInputStream(PipedOutputStream src) 创建一个 PipedInputStream 以便它连接到管道输出流 src。 PipedInputStream(PipedOutputStream src, int pipeSize) 创建一个 PipedInputStream 以便它连接到管道输出流 src 并为管道缓冲区使用指定的管道大小。 方法总结 修饰符和类型 方法 描述 int available() 返回可以不阻塞地从此输入流中读取的字节数。 void close() 关闭此管道输入流并释放与该流关联的任何系统资源。 void connect(PipedOutputStream src) 导致此管道输入流连接到管道输出流 src。 int read() 从此管道输入流中读取数据的下一个字节。 int read(byte[] b, int off, int len) 从此管道输入流中读取最多 len 个字节的数据到一个字节数组中。 protected void receive(int b) 接收一个字节的数据。 从类 java.io.InputStream 继承的方法 mark, markSupported, read, reset, skip 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 字段详细信息 PIPE_SIZE protected static final int PIPE_SIZE 管道的循环输入缓冲区的默认大小。 Since: JDK1.1 buffer protected byte[] buffer 放置传入数据的循环缓冲区。 Since: JDK1.1 in protected int in 当从连接的管道输出流接收时,循环缓冲区中将存储下一个字节数据的位置的索引。 in<0 表示缓冲区为空,in==out 表示缓冲区已满 Since: JDK1.1 out protected int out 此管道输入流将读取下一个数据字节的循环缓冲区中位置的索引。 Since: JDK1.1 构造函数详细信息 PipedInputStream public PipedInputStream(PipedOutputStream src) throws IOException 创建一个 PipedInputStream...

OutputStreamWriter java.lang.Object |—java.io.Writer |—|—java.io.OutputStreamWriter public class OutputStreamWriter extends Writer OutputStreamWriter 是从字符流到字节流的桥梁:写入其中的字符使用指定的字符集编码为字节。 它使用的字符集可以由名称指定,也可以显式给出,或者可以接受平台的默认字符集。 每次调用 write() 方法都会导致对给定字符调用编码转换器。 结果字节在写入底层输出流之前累积在缓冲区中。 可以指定此缓冲区的大小,但默认情况下它对于大多数用途来说足够大。 请注意,传递给 write() 方法的字符不会被缓冲。 为了获得最高效率,请考虑将 OutputStreamWriter 包装在 BufferedWriter 中,以避免频繁的转换器调用。 例如: Writer out = new BufferedWriter(new OutputStreamWriter(System.out)); 代理项对是由两个 char 值的序列表示的字符:在 ‘\uD800’ 到 ‘\uDBFF’ 范围内的高代理项,然后是在 ‘\uDC00’ 到 ‘\uDFFF’ 范围内的低代理项。 畸形的替代元素是高替代元素之后没有低替代元素或低替代元素之前没有高替代元素。 这个类总是用字符集的默认替换序列替换格式错误的代理元素和不可映射的字符序列。 当需要对编码过程进行更多控制时,应使用 CharsetEncoder 类。 Since: JDK1.1 字段摘要 从类 java.io.Writer 继承的字段 lock 构造函数摘要 构造函数 描述 OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的 OutputStreamWriter。 OutputStreamWriter(OutputStream out, String charsetName) 创建一个使用命名字符集的 OutputStreamWriter。 OutputStreamWriter(OutputStream out, Charset cs) 创建一个使用给定字符集的 OutputStreamWriter。 OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建一个使用给定字符集编码器的 OutputStreamWriter。 方法总结 修饰符和类型 方法 描述 void close() 关闭流,首先刷新它。 void flush() 冲洗流。 String getEncoding() 返回此流使用的字符编码的名称。 void write(char[] cbuf, int off, int len) 写入字符数组的一部分。 void write(int c) 写入单个字符。 void write(String str, int off, int len) 写入字符串的一部分。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 从类 java.io.Writer 继承的方法 append, append, append, write, write 构造函数详细信息 OutputStreamWriter public OutputStreamWriter(OutputStream out, String charsetName) throws UnsupportedEncodingException 创建一个使用命名字符集的 OutputStreamWriter。 参数: 参数名称 参数描述 out 输出流 charsetName 支持的字符集的名称 Throws: Throw名称 Throw描述 UnsupportedEncodingException 如果不支持命名编码 OutputStreamWriter...

OutputStream java.lang.Object |—java.io.OutputStream public abstract class OutputStream extends Object implements Closeable, Flushable 这个抽象类是代表字节输出流的所有类的超类。 输出流接受输出字节并将它们发送到某个接收器。 需要定义 OutputStream 子类的应用程序必须始终提供至少一个写入一个字节输出的方法。 Since: JDK1.0 构造函数摘要 构造函数 描述 OutputStream() 方法总结 修饰符和类型 方法 描述 void close() 关闭此输出流并释放与此流关联的所有系统资源。 void flush() 刷新此输出流并强制写出任何缓冲的输出字节。 void write(byte[] b) 将指定字节数组中的 b.length 个字节写入此输出流。 void write(byte[] b, int off, int len) 将指定字节数组中的 len 个字节写入此输出流。 abstract void write(int b) 将指定字节写入此输出流。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 构造函数详细信息 OutputStream public OutputStream() 方法详情 write public abstract void write(int b) throws IOException 将指定字节写入此输出流。 写入的一般约定是将一个字节写入输出流。 要写入的字节是参数 b 的 8 个低位。 b 的高 24 位被忽略。 OutputStream 的子类必须提供此方法的实现。 参数: 参数名称 参数描述 b 字节。 Throws: Throw名称 Throw描述 IOException 如果发生 I/O 错误。 特别是,如果输出流已关闭,则可能会引发 IOException。 write public void write(byte[] b) throws IOException 将指定字节数组中的 b.length 个字节写入此输出流。 write(b) 的一般约定是它应该与调用 write(b, 0, b.length) 具有完全相同的效果。 参数: 参数名称 参数描述 b 数据。 Throws: Throw名称 Throw描述 IOException 如果发生 I/O 错误。 write public void write(byte[] b, int off, int len) throws IOException 将指定字节数组中的...

ObjectStreamField java.lang.Object |—java.io.ObjectStreamField public class ObjectStreamField extends Object implements Comparable<Object> 来自 Serializable 类的 Serializable 字段的描述。 ObjectStreamFields 数组用于声明类的 Serializable 字段。 Since: 1.2 构造函数摘要 构造函数 描述 ObjectStreamField(String name, Class<?> type) 创建具有指定类型的 Serializable 字段。 ObjectStreamField(String name, Class<?> type, boolean unshared) 创建一个表示具有给定名称和类型的可序列化字段的 ObjectStreamField。 方法总结 修饰符和类型 方法 描述 int compareTo(Object obj) 将此字段与另一个 ObjectStreamField 进行比较。 String getName() 获取该字段的名称。 int getOffset() 实例数据中的字段偏移量。 Class<?> getType() 获取字段的类型。 char getTypeCode() 返回字段类型的字符编码。 String getTypeString() 返回 JVM 类型签名。 boolean isPrimitive() 如果此字段具有原始类型,则返回 true。 boolean isUnshared() 返回布尔值,指示此 ObjectStreamField 实例表示的可序列化字段是否未共享。 protected void setOffset(int offset) 实例数据内的偏移量。 String toString() 返回描述该字段的字符串。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait 构造函数详细信息 ObjectStreamField public ObjectStreamField(String name, Class<?> type) 创建具有指定类型的 Serializable 字段。 该字段应使用 serialField 标签记录。 参数: 参数名称 参数描述 name 可序列化字段的名称 type 可序列化字段的 Class 对象 ObjectStreamField public ObjectStreamField(String name, Class<?> type, boolean unshared) 创建一个表示具有给定名称和类型的可序列化字段的 ObjectStreamField。 如果 unshared 为 false,则表示字段的值以默认方式进行序列化和反序列化 – 如果该字段是非原始的,则对象值将被序列化和反序列化,就好像它们已通过调用 writeObject 和 readObject 进行写入和读取一样。 如果 unshared 为真,则表示字段的值将被序列化和反序列化,就好像它们已通过调用 writeUnshared 和 readUnshared 进行写入和读取一样。 参数: 参数名称 参数描述 name 字段名称 type 字段类型...

ObjectStreamClass java.lang.Object |—java.io.ObjectStreamClass public class ObjectStreamClass extends Object implements Serializable 类的序列化描述符。 它包含类的名称和 serialVersionUID。 可以使用查找方法找到/创建此 Java VM 中加载的特定类的 ObjectStreamClass。 计算 SerialVersionUID 的算法在对象序列化规范,第 4.6 节,流唯一标识符中描述。 Since: JDK1.1 字段摘要 修饰符和类型 字段 描述 static ObjectStreamField[] NO_FIELDS serialPersistentFields 值指示没有可序列化的字段 方法总结 修饰符和类型 方法 描述 Class<?> forClass() 返回此版本映射到的本地 VM 中的类。 ObjectStreamField getField(String name) 按名称获取此类的字段。 ObjectStreamField[] getFields() 返回此可序列化类的字段数组。 String getName() 返回此描述符所描述的类的名称。 long getSerialVersionUID() 返回此类的 serialVersionUID。 static ObjectStreamClass lookup(Class<?> cl) 查找可以序列化的类的描述符。 static ObjectStreamClass lookupAny(Class<?> cl) 返回任何类的描述符,无论它是否实现 Serializable。 String toString() 返回描述此 ObjectStreamClass 的字符串。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait 字段详细信息 NO_FIELDS public static final ObjectStreamField[] NO_FIELDS serialPersistentFields 值指示没有可序列化的字段 方法详情 lookup public static ObjectStreamClass lookup(Class<?> cl) 查找可以序列化的类的描述符。 如果类尚不存在,则创建一个 ObjectStreamClass 实例。 如果指定的类没有实现 java.io.Serializable 或 java.io.Externalizable,则返回 Null。 参数: 参数名称 参数描述 cl 获取描述符的类 返回: 指定类的类描述符 lookupAny public static ObjectStreamClass lookupAny(Class<?> cl) 返回任何类的描述符,无论它是否实现 Serializable。 参数: 参数名称 参数描述 cl 获取描述符的类 返回: 指定类的类描述符 Since: 1.6 getName public String getName() 返回此描述符所描述的类的名称。 此方法以 Class#getName...

ObjectOutputStream.PutField java.lang.Object |—java.io.ObjectOutputStream.PutField public abstract static class ObjectOutputStream.PutField extends Object 提供对要写入 ObjectOutput 的持久字段的编程访问。 Since: 1.2 构造函数摘要 构造函数 描述 PutField() 方法总结 修饰符和类型 方法 描述 abstract void put(String name, boolean val) 将命名布尔字段的值放入持久字段中。 abstract void put(String name, byte val) 将命名字节字段的值放入持久字段。 abstract void put(String name, char val) 将命名 char 字段的值放入持久字段。 abstract void put(String name, double val) 将命名双字段的值放入持久字段。 abstract void put(String name, float val) 将命名浮点字段的值放入持久字段。 abstract void put(String name, int val) 将命名的 int 字段的值放入持久字段中。 abstract void put(String name, long val) 将命名长字段的值放入持久字段。 abstract void put(String name, short val) 将命名短字段的值放入持久字段中。 abstract void put(String name, Object val) 将命名对象字段的值放入持久字段。 abstract void write(ObjectOutput out) 已弃用。 此方法不会以正确的格式写入此 PutField 对象包含的值,并且可能会导致序列化流损坏。 写入 PutField 数据的正确方法是调用 ObjectOutputStream.writeFields() 方法。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 构造函数详细信息 PutField public PutField() 方法详情 put public abstract void put(String name, boolean val) 将命名布尔字段的值放入持久字段中。 参数: 参数名称 参数描述 name 可序列化字段的名称 val 要分配给字段的值 Throws: Throw名称 Throw描述 IllegalArgumentException 如果名称与正在写入其字段的类的可序列化字段的名称不匹配,或者如果命名字段的类型不是布尔值 put public abstract void put(String name, byte val) 将命名字节字段的值放入持久字段。 参数: 参数名称 参数描述 name 可序列化字段的名称 val 要分配给字段的值 Throws: Throw名称 Throw描述 IllegalArgumentException 如果名称与正在写入其字段的类的可序列化字段的名称不匹配,或者如果命名字段的类型不是字节 put public abstract void put(String name, char val) 将命名 char 字段的值放入持久字段。 参数: 参数名称 参数描述 name 可序列化字段的名称...

ObjectOutputStream java.lang.Object |—java.io.OutputStream |—|—java.io.ObjectOutputStream public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants ObjectOutputStream 将 Java 对象的原始数据类型和图形写入 OutputStream。 可以使用 ObjectInputStream 读取(重构)对象。 对象的持久存储可以通过使用流的文件来实现。 如果流是网络套接字流,则可以在另一个主机或另一个进程中重构对象。 只有支持 java.io.Serializable 接口的对象才能写入流。 每个可序列化对象的类都经过编码,包括类的类名和签名、对象的字段和数组的值,以及从初始对象引用的任何其他对象的闭包。 writeObject 方法用于将对象写入流。任何对象,包括字符串和数组,都是用 writeObject 编写的。可以将多个对象或原语写入流。对象必须从相应的 ObjectInputstream 以与写入时相同的类型和相同的顺序读回。 原始数据类型也可以使用 DataOutput 中的适当方法写入流。也可以使用 writeUTF 方法写入字符串。 对象的默认序列化机制写入对象的类、类签名以及所有非瞬态和非静态字段的值。对其他对象的引用(瞬态或静态字段除外)也会导致这些对象被写入。使用引用共享机制对单个对象的多个引用进行编码,以便对象的图形可以恢复到与原始对象写入时相同的形状。 比如写一个ObjectInputStream中的例子可以读取的对象: FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(12345); oos.writeObject("Today"); oos.writeObject(new Date()); oos.close(); 在序列化和反序列化过程中需要特殊处理的类必须实现具有这些确切签名的特殊方法: private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; private void writeObject(java.io.ObjectOutputStream stream) throws IOException private void readObjectNoData() throws ObjectStreamException; writeObject 方法负责为其特定类写入对象的状态,以便相应的 readObject 方法可以恢复它。该方法不需要关注属于对象的超类或子类的状态。通过使用 writeObject 方法或使用 DataOutput 支持的原始数据类型的方法将各个字段写入 ObjectOutputStream 来保存状态。 序列化不会写出任何未实现 java.io.Serializable 接口的对象的字段。不可序列化的对象的子类可以是可序列化的。在这种情况下,不可序列化的类必须有一个无参数的构造函数来允许其字段被初始化。在这种情况下,子类负责保存和恢复不可序列化类的状态。通常情况下,该类的字段是可访问的(公共的、包的或受保护的),或者存在可用于恢复状态的 get 和 set 方法。 可以通过实现抛出 NotSerializableException 的 writeObject 和 readObject 方法来防止对象的序列化。异常将被 ObjectOutputStream 捕获并中止序列化过程。 实现 Externalizable 接口允许对象完全控制对象序列化形式的内容和格式。调用 Externalizable 接口的方法 writeExternal 和 readExternal 来保存和恢复对象状态。当由一个类实现时,它们可以使用 ObjectOutput 和 ObjectInput 的所有方法写入和读取自己的状态。对象负责处理发生的任何版本控制。 枚举常量的序列化方式与普通的可序列化或可外部化对象不同。枚举常量的序列化形式仅由其名称组成;不传输常量的字段值。为了序列化枚举常量,ObjectOutputStream 写入常量的 name 方法返回的字符串。与其他可序列化或可外部化的对象一样,枚举常量可以充当随后出现在序列化流中的反向引用的目标。无法自定义枚举常量序列化的过程;在序列化过程中,枚举类型定义的任何类特定的 writeObject 和 writeReplace 方法都会被忽略。同样,任何...

ObjectInputStream.GetField java.lang.Object |—java.io.ObjectInputStream.GetField public abstract static class ObjectInputStream.GetField extends Object 提供对从输入流中读取的持久字段的访问。 构造函数摘要 构造函数 描述 GetField() 方法总结 修饰符和类型 方法 描述 abstract boolean defaulted(String name) 如果命名字段是默认的并且在此流中没有值,则返回 true。 abstract boolean get(String name, boolean val) 从持久字段中获取命名布尔字段的值。 abstract byte get(String name, byte val) 从持久字段中获取命名字节字段的值。 abstract char get(String name, char val) 从持久字段中获取命名字符字段的值。 abstract double get(String name, double val) 从持久字段中获取命名双字段的值。 abstract float get(String name, float val) 从持久字段中获取命名浮点字段的值。 abstract int get(String name, int val) 从持久字段中获取命名的 int 字段的值。 abstract long get(String name, long val) 从持久字段中获取命名长字段的值。 abstract short get(String name, short val) 从持久字段中获取命名短字段的值。 abstract Object get(String name, Object val) 从持久字段中获取命名对象字段的值。 abstract ObjectStreamClass getObjectStreamClass() 获取描述流中字段的 ObjectStreamClass。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 构造函数详细信息 GetField public GetField() 方法详情 getObjectStreamClass public abstract ObjectStreamClass getObjectStreamClass() 获取描述流中字段的 ObjectStreamClass。 返回: 描述可序列化字段的描述符类 defaulted public abstract boolean defaulted(String name) throws IOException 如果命名字段是默认的并且在此流中没有值,则返回 true。 参数: 参数名称 参数描述 name 字段名称 返回: true,当且仅当命名字段是默认的 Throws: Throw名称 Throw描述 IOException 如果从底层 InputStream 读取时出现 I/O 错误 IllegalArgumentException 如果名称不对应于可序列化的字段 get public abstract boolean get(String name, boolean val) throws IOException 从持久字段中获取命名布尔字段的值。 参数: 参数名称 参数描述 name 字段名称 val 如果 name 没有值,则使用默认值 返回: 命名布尔字段的值 Throws: Throw名称 Throw描述 IOException 如果从底层 InputStream 读取时出现 I/O 错误 IllegalArgumentException...

ObjectInputStream java.lang.Object |—java.io.InputStream |—|—java.io.ObjectInputStream public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的原始数据和对象。 当分别与 FileOutputStream 和 FileInputStream 一起使用时,ObjectOutputStream 和 ObjectInputStream 可以为应用程序提供对象图的持久存储。 ObjectInputStream 用于恢复之前序列化的那些对象。 其他用途包括使用套接字流在主机之间传递对象或在远程通信系统中编组和解组参数和参数。 ObjectInputStream 确保从流创建的图中所有对象的类型与 Java 虚拟机中存在的类匹配。 使用标准机制根据需要加载类。 只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流中读取。 readObject 方法用于从流中读取对象。 应该使用 Java 的安全转换来获得所需的类型。 在 Java 中,字符串和数组是对象,在序列化过程中被视为对象。 读取时需要将它们转换为预期的类型。 可以使用 DataInput 上的适当方法从流中读取原始数据类型。 对象的默认反序列化机制将每个字段的内容恢复为写入时的值和类型。反序列化过程会忽略声明为瞬态或静态的字段。对其他对象的引用会导致根据需要从流中读取这些对象。使用参考共享机制正确恢复对象图。反序列化时总是分配新对象,这样可以防止现有对象被覆盖。 读取对象类似于运行新对象的构造函数。为对象分配内存并初始化为零 (NULL)。为不可序列化类调用无参数构造函数,然后从流中恢复可序列化类的字段,从最接近 java.lang.object 的可序列化类开始,到对象最具体的类结束。 例如,从 ObjectOutputStream 中的示例编写的流中读取: FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); int i = ois.readInt(); String today = (String) ois.readObject(); Date date = (Date) ois.readObject(); ois.close(); 类通过实现 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...