hrows IOException 这个 constructor
15. 如何设置 Java 2(JDK1.2)的环境变量? 答:Java 2 安装后,需要设置 PATH 和 JAVA_HOME 环境变量。与 JDK1.1 不同的是:设置好 JAVA_HOME 环境变量后,JVM 将自动
搜索系统类库以及用户的当前路径。Java 2 环境变量的设置如下例所示: Solaris 平台: setenv JAVA_HOME Java2 的安装路径 setenv PATH $JAVA_HOME/bin:${PATH} Windows 平台:set JAVA_HOME=
Java2 的安装路径 set PATH=$JAVA_HOME\bin;%PATH%
16. 哪些 Java 集成开发工具支持 Java 2? 答:目前流
行的 Java 集成开发环境,如 Inprise 的 Jbuilder;Symantec 的 Visual Cafe,;Sybase 的 PowerJ 都支持 Java 2。
17. 如果在 Netscape 或 IE 浏览器中运行 Java applet 时出现了错误,如何确定错误范围? 答:当 java applet 在浏览器中运行时,使用的是浏览器本身的缺省 JVM。而不同浏览器对 JDK 的支持程度 也不尽相同。因此,在 Netscape 或 IE 浏览器中运行 Java applet 出现了错误,建议使用 JDK 提供的工具 appletviewer 或 Sun 公司的 Hotjava 浏览器来测试该 applet, 以确定错误的产生是与浏览器相关。 如果 applet 在 appletviewer 或 Hotjava 中运行一切正常, 则错误的产生是由于浏览器不完全兼容 JDK 而引起的。 此时, 解决方法可以是使用 Hotjava 浏览器或者安装 Sun 公司的 Java Plugin。如果 applet 在 Hotjava 浏览器或 appletviewer 中运行即发生错误,则应当根据错误提示检查 applet 程序。
18. 在 Java 语言中,如何列出 PC 机文件系统中的所有驱动器名? 答:在 Java 2 版本中,java.io 包中的 File 类新增加了方法 listRoots()可以实现这一功能。
19. 为什么 Runtime.exec("ls")没有任何输出? 答:调用 Runtime.exec 方法将产生一个本地的进程,并返回一个 Process 子类的实例,该实例可用于控制 进程或取得进程的相关信息。由于调用 Runtime.exec 方法所创建的子进程没有自己的终端或控制台,因此 该子进程的标准 IO(如 stdin, stdou, stderr)都通过 Process.getOutputStream(), Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了。 用户需要用这些 stream 来向子进程输入数据或获取 子进程的输出。所以正确执行 Runtime.exec("ls")的例程如下: try { process = Runtime.getRuntime().exec (command); InputStreamReader ir=newInputStreamReader(process.getInputStream()); LineNumberReader input = new LineNumberReader (ir); String line;
while ((line = 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()方法 来通知它。