ne = input.readLine ()) != null) System.out.println(line); } catch (java.io.IOException e){ System.err.println ("IOException " + e.getMessage()); }
20. 若通过 ObjectOutputStream 向一个文件中多次以追加方式写入 object,为什么用 ObjectInputStream 读取这些 object 时会产生 StreamCorruptedException? 答:使用缺省的 serializetion 的实现时, 一个 ObjectOutputStream 的构造和一个 ObjectInputStream 的构造 必须一一对应。ObjectOutputStream 的构造函数会向输出流中写入一个标识头,而 ObjectInputStream 会 首先读入这个标识头。因此,多次以追加方式向一个文件中写入 object 时,该文件将会包含多个标识头。 所以用 ObjectInputStream 来 deserialize 这个 ObjectOutputStream 时, 将产生 StreamCorruptedException。 一种解决方法是可以构造一个 ObjectOutputStream 的子类,并覆盖 writeStreamHeader()方法。被覆盖后 的 writeStreamHeader() 方
法 应 判 断 是 否 为 首 次 向 文 件 中 写 入 object ? 若 是 , 则 调 用 super.writeStreamHeader();若否,即以追加方式写入 object 时,则应调用 ObjectOutputStream.reset() 方法。
21. 对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中? 答: 目前,没有直接的方法可以将对象写入到随机存取文件中。但是可以使用 ByteArray 输入/输出流作为中 介, 来向随机存取文件中写入或从随机存取文件中读出字节, 并且可以利用字节流来创建对象输入/输出流, 以用于读写对象。需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误。例如, java.io.ByteArrayOutputStream 可用于获取 ObjectOutputStream 的字节流,从中可得到 byte 数组并可将 之写入到随机存取文件中。相反,我们可以从随机存取文件中读出字节数组,利用它可构造 ByteArrayInputStream,进而构造出 ObjectInputStream,以读取对象。
22. 在 JDK1.1 中 Thread 类定义了 suspend()和 resume()方法,但是在 JDK1.2 中已经过时,应使用什么方 法来替代之? 答: Thread.suspend 本身易于产生死锁。如果一个目标线程对某一关键
系统资源进行了加锁操作,然后该线 程被 suspend,那么除非该线程被 resume,否则其它线程都将无法访问该系统资源。如果另外一个线程将 调用 resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁。 因此,在 Java 2 中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂 状态时,可以使用 wait()方法使之处于等待状态。一旦需要该线程继续运行,其它线程会调用 notify()方法 来通知它。