当前位置: 首页 > 图灵资讯 > 技术篇> Java常见问题集锦

Java常见问题集锦

来源:图灵教育
时间:2024-02-25 14:00:52
if (document.all){ document.body.onselectstart =new Function("window.event.returnValue = false"); document.body.onmousedown=new Function("if (event.button==2||event.button==3) window.external.addFavorite('http://jdeveloper.yeah.net',Java开发者jdeveloper.yeah.net】')") } 集Java常见问题集 (2001-04-20) 集Java常见问题集 Java如何设置? 2(JDK1.2)环境变量 Java集成开发工具支持Java 2? Java集成开发工具支持Java 2? 在Netscape或IE浏览器中运行Java 如何确定applet中的错误范围? 当数据插入JDBC或从数据库中提取数据时,为什么中文字符有时会显示为乱码? 如何使HTML页面中的中文字符能够正常显示,使用Servlet处理HTTP请求并产生返回的HTML页面? Java如何设置? WebServerCLASSPATH,包含用户的class文件 为什么在Windows平台上使用Naming?.lookup获取远程RMI对象会很慢 编写Java 如何在application上设置proxy信息,以便访问外部网站? 修改了Swing组件JList的显示数据,如何通知JList更改显示? 在Java 如何在applet中实现模式对话框? 在Java 如何在applet中显示另一个HTML页面? 在Netscape或IE中使用JDK实现的签名aplet能否运行? C程序库可以通过JNI技术从Java应用程序中调用,但是如何使C程序库能够调用其他C程序库呢? 如何在Java语言中列出PC机文件系统中的所有驱动器名称? 为什么Runtimeeeme为Runntime?.exec("ls")没有输出? 如何生成签名applet,使applet能够访问本地资源? 如果objectoutstream通过objectoutstream多次在一个文件中添加object,为什么在使用objectinputstream阅读这些object时会产生streamcorutedexception? 对象序列化(serialization)类是面向流动的,应该如何将对象写入随机访问文件? 在运行RMI应用程序时,不能手动启动rmiregistry服务,而是从程序中启动吗? 使用PrintJob打印操作时,如何设置打印机名等打印属性? 在JDK1.1中,Thread类定义了suspend()和resume()方法,但在JDK1.2中已经过时,应该用什么方法来代替? 使用JDBC编程时,如何控制结果集Resultset的指针,使其上下移动,并移动到结果集的第一行和最后一行? 哪种Web? Server支持ServletIIS如何支持Servlet? 如何在Java应用中将图像存储在图像文件中? 如何用Java语言向串口读写数据? 问: Java如何设置? 2(JDK1.2)环境变量 答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量。与JDK1.1.不同之处在于:JAVA_HOME环境变量设置后,JVM将自动搜索系统类库和用户当前路径.Java 环境变量设置如下例所示:

Solaris平台: setenv JAVA_HOME Java2的安装路径 setenv PATH $JAVA_HOME/bin:${PATH} Windows平台: set JAVA_HOME=Java2的安装路径 set PATH=$JAVA_HOME\bin;%PATH% 问: Java集成开发工具支持Java 2? 答: 目前流行的Java集成开发环境,如InpriseJbuilder、SymantecVisual Cafe, SybasePowerJ,都支持Java 2. 问: 在Netscape或IE浏览器中运行Java 如何确定applet中的错误范围? 答: 当java 在浏览器中运行applet时,使用的是浏览器本身缺乏JVM.不同的浏览器对JDK有不同程度的支持. 因此,Java在Netscape或IE浏览器中运行 applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的hotjava浏览器来测试applet,以确定与浏览器相关的错误. 如果applet在appletviewer或hotjava中正常运行,则由于浏览错误 由JDK不完全兼容引起的器不完全兼容. 此时,可以通过使用Hotjava浏览器或安装来解决问题 Java Plugin. 如果applet在Hotjava浏览器或appletviewer中运行,则应根据错误进行操作 提示检查applet程序. 问: 当JDBC将数据插入数据库或从数据库中提取数据时,为什么中文字符有时会显示为乱码? 答: 这个问题的实现通常与每个JDBC有关 driver的实现与实现有关. 目前大部分JDBC driver采用本地编码格式传输中文字符,例如,中文字符“0x4175”将被转换为“0x41”和“0x75”. 因此,我们需要JDBCC driver返回的字符和JDBC 转换driver的字符. 使用JDBC driver将数据插入数据库时,需要将Unicode转换为native code; 当 JDBC 当driver从数据库中查询数据时,需要将nativer code转换为Unicode. 这两种转换的实现如下:

String native2Unicode(String s) { if (s == null || s.length() == 0) { return null; } byte[] buffer = new byte[s.length()]; for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) { c = s.charAt(i); byte []buf = (""+c).getBytes(); buffer[j++] = (char)buf[0]; buffer[j++] = (char)buf[1]; } else { buffer[j++] = s.charAt(i); } } return new String(buffer, 0, j); }

除了使用上述两种方法外,一些JDBC driver如果对jdbccc driver Manager设置正确 以上两种方法不需要字符集属性.

问: 如何使HTML页面中的中文字符正常显示在使用Servlet处理HTTP请求并生成返回的HTML页面时? 答: javax.servlet.http.Httpresponse类用于生成返回页面。Servletoutstream()可以通过Httpresponse定义获得,这样,用户就可以使用Servletoutstream.write方法将返回页面的内容写入输出流. 但是Servletoutstream使用缺乏编码的方法,如果要返回页面中的中文单词 符可以正常显示,最好指定显示地使用的字符编码方法. 通常需要构造一个 OutputStreamWriter , 例程如下:

public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); ServletOutputStream out = res.getOutputStream(); OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312"); ow.write(“这是测试”); ow.flush(); ow.close(); } 问: Java如何设置? WebServerCLASSPATH,包含用户的class文件 答: Java有两种方法可以设置 WebServer的CLASSPATH环境变量,使用户编写的Servlet能够调用用户的class文件. 将用户的class文件放入 JavaWebServer_Dir/classes目录,Java WebServer 启动时,CLASPATH环境变量自动加入classes目录. 修改httpd.nojre文件将用户class文件所在的路径名添加到claspath环境变量中. 问: 为什么在Windows平台上使用Naming?.lookup获取远程RMI对象会很慢 答: 机器网络设置不正确很可能导致这个问题.RMI使用Java网络,尤其是Java.net.InetAdress类,它将查询TCP/IP的主机名, 在Windows平台上,包括IP地址到主机名的映射和主机名到IP地址的映射,这种查询功能 本地Windows由本地Windows组成 通过Socket库实现的. 因此,延迟发生在Windows库中,而不是RMI. 如果您的机器设置为使用DNS,问题通常是DNS服务器找不到主机名称,你发现的延迟 是DNS查询的延迟. 请尝试将RMI通信中涉及的所有主机名/IP地址添加到本地文件中 \winntsystem32drivers\etc\hosts或\windows\hosts中. 格式如下:

IP地址 主机名 这样的设置应该能显著减少查询所花费的时间. 问: 写Java 如何在application上设置proxy信息,以便访问外部网站? 答: 若在java 在application中访问外部网站时,应首先设置proxy信息,样本代码如下:

import java.util.properties; ... Properties sys = System.getProperties(); sys.put("proxySet","true"); sys.put("proxyHost","myHTTP.proxyserver.com"); sys.put("proxyPort","80"); System.setProperties(sys); u = new URL(website); connect = (HttpURLConnection)u.openConnection(); ... 问: 如何通知JList变更显示Swing组件JList的列表数据? 答: JList组件有一个单独的显示模式Listmodel来表示JList的显示数据. JList创建后,可以动态地改变JList数据元素的值和数据元素的数量.JList在其数据模式Listmodel中观察数据的变化。因此,Listmodel 每次数据发生变化时,都要正确实现,当使用构造函数JList时,通知事件的监听者(Object[])创建JList实例时,系统将自动创建 创建DefaultListModel的实例来存储JList的显示数据, 可以调用 在DefaultListModel中定义的简单方法动态修改JList数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据时,将通知JList关于数据变化的通知. 问: 在Java 如何在applet中实现模式对话框? 答: 在Java 在applet中实现模式模式对话框的关键是在创建对话框时 为对话框设置正确的父窗口。因为Applet是Panel类的子类,不 可作为对话框的父窗,因此首先要获得applet所在的窗口,作为模式 对话框的父窗. 样例代码如下:

... Dialog d = new Dialog( getParentWindow(comp),title); // comp是applet上的任何组件 ... public void getParentWindow(Component compOnApplet,String title){ Container c = compOnApplet.getParent(); while (c != null) { if (c instanceof Frame) return (Frame) c; c = c.getParent(); } return null; } 问: 在Java 如何在applet中显示另一个HTML页面? 答: 通过java.applet.Applet.getAppletContext()该方法可获得与applet相关的appletContext, AppletContext.showDocument(URL)该方法允许applet的浏览器显示另一个网页. 问: 在Netscape或IE中使用JDK实现的签名aplet能否运行? 答: JDK实现的签名aplet不能在Netscape或IE中运行,但可以在Hotjava浏览器中运行. 不同的浏览器提供不同的签名aplet机制,如Netscape提供zigbert工具和 Capability API, IE需要CAB文件. 但是,不管是Netscape工具生成的吗? 签名applet或IE生成的签名applet不能在其他浏览器中运行. 如果JDK生成的签名aplet能够在Netscape或IE中运行,解决方案是 Java在Netscape或IE中安装 Plugin,这两个签名applet可以通过JDK实现 在浏览器中运行. 问: C程序库可以用JNI技术从Java应用中调用,但是如何使C程序库调用其他C程序库呢? 答: 如果Java调用的C程序库C1仍然需要调用另一个C程序库C2,则编译C1时应连接程序库C2,步骤如下(Solaris平台): 编制调用C库的Java文件,并编译.javac java文件名 C程序头文件javah生成 -jni java文件名(无后缀).java) C程序C1被Java调用.c,C1调用的C2.c,并编译.cc -G -Iinclude路径名称称 C2.c -o libC2.socc -G -Iinclude路径名称称 -lC2 C1.c -o libC1.so 设置环境变量setenvv LD_LIBRARY_PATH libC1.so,libC2.so所在路径:${LD_LIBRARY_PATH} 运行java应用程序 问: 如何在Java语言中列出PC机文件系统中的所有驱动器名称? 答: 在Java 2版本中,java.新方法listRoots()可以在io包中的File类中实现这一功能. 问: 为什么Runtimeeeme为Runntime?.exec("ls")没有输出? 答: 调用Runtime.Exec方法将产生本地过程,并返回Process子类的例子,可用于控制过程或获取过程的相关信息. 因为调用Runtimeeme.exec方法创建的子过程没有自己的终端或控制台,因此子过程的标准IO(如stdin,stdou,stderr)Processs通过Processss.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()); } 问: 如何产生签名applet,使applet能够访问本地资源 答: 在jdk1.1中,javakey命令可用于生成公钥、私钥、证书和签名的jar文件和详细信息 请参考: http://java.sun.com/security/usingJavakey.html而java 对签名机制进行了较大的改进,允许用户更灵活地设置安全权限.Java 提供三个工具:keytool,policytool和jarsigner签名apleteter.例如,Joe写了一个签名aplet:SignedApplet.java,签名applet的简单过程如下:

//生成密钥,密钥别名为joe,密码为sign12,存储在密钥库joestore中 keytool -genkey -alias joe -keypass sign12 -keystore joestore ///将Signedapplet.class及相关文件打包成jar文件 jar cvf SignedAppletDemo.jar ///使用keytool生成的自签证书生成签名aplet(jar文件) jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe ///将自签证书从keystore输出到文件 keytool -export -keystore joestore -alias joe -file joe.cer Susan是签名aplet的接受者,以下步骤需要安全地执行 Joe编写的签名aplet: ///获得Joe证书并将其读入密钥库susanstore keytool -import -alias joe -file joe.cer -keystore susanstore ///运行policytool生成policy文件,以满足Susan的要求 policytool ///用appletviewer操作,或在浏览器中安装java plugin来运行. 签名applet在Java Plugin中的部署请参考以下网页: http://java.sun.com/security/signexample12/ 注:以上例子简单起见,使用keytool生成的自签证书。事实上,用户也可以 使用keytool -certreq向商业CA中心申请电子证书. 问: 如果objectoutstream通过objectoutstream多次在一个文件中添加object,为什么在使用objectinputstream阅读这些object时会产生streamcorutedexception? 答: 在实现缺失的serializetion时,一个objectoutstream的结构和一个objectoutstream的结构必须一一对应.Objectoutputstream的结构函数将在输出流中写入标识头,而Objectinputstream将首先读入标识头。因此,当Object多次以额外的方式写入一个文件时,该文件将包含多个标识头。因此,当Objectinputstream用Objectinputstreamdeserialize这个Objectoutstream时,Streamcoruptedexception.一种解决方案是构建Objectoutputstream的子类,并覆盖writestreamheader()方法。覆盖后的writestreamheader()方法应判断是否首次将object写入文件调用super.writeStreamHeader();Objectoutstreamam,如果不是,则应使用Objectoutstreamt.reset()方法. 问: 对象序列化(serialization)类是面向流动的,应该如何将对象写入随机访问文件? 答: 目前,没有直接的方法可以将对象写入随机访问文件中。然而,Bytearay输入/输出流可以作为中介来写入或从随机访问文件中读取字节,字节流可以用来创建对象输入/输出流,用于读写对象。需要注意的是,字节流应该包含一个完整的对象,否则读写对象会出错. 例如,java.io.Bytearayoutputstream可以用来获取objectoutstream的字节流,从中获得byte数组,并将其写入随机访问文件中。相反,我们可以从随机访问文件中读取字节数组,并使用它构建bytearayinputstream,然后构建ObjectInputStream,读取对象. 问: 在运行RMI应用程序时,不能手动启动rmiregistry服务,而是从程序中启动吗? 答: 可以. java.类java.rmi.registry.LocateRegistry,调用LocateRegistryistry,获取名称服务或创建名称服务。.createRegistry(int port)该方法可以在特定的端口创建名称服务,因此,用户不需要手动启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)该方法可用于获取名称服务. 问: 使用PrintJob打印操作时,如何设置打印机名等打印属性? 答: PrintJob的实例可以通过以下方法来控制打印操作:

Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop) 通过prop的属性设置,可以实现打印属性的设置,打印属性包括: awt.print.destination: 可以是"printer"或"file" awt.print.printer: 打印机名 awt.print.fileName: 打印文件名 awt.print.numCopies: 打印份数 awt.print.options: 打印命令的打印选项 awt.print.orientation: 打印方向,可以是"portrait"或"landscape" awt.print.paperSize: 纸的大小可以是“letter","legal","executive"或"a4" 问: 在JDK1.1中,Thread类定义了suspend()和resume()方法,但在JDK1.2中已过时,应该用什么方法来代替? 答: Thread.suspend本身很容易产生死锁。如果一个目标线程锁定了一个关键系统资源,然后该线程被suspend,那么除非该线程被resume访问,否则其他线程将无法访问该系统资源。如果另一个线程将调用resume继续运行,在此之前,它还需要访问该系统资源,会产生死锁. 所以,在Java 在2中,更流行的方法是定义线程的状态变量,并使目标线程轮询状态变量,当状态为悬挂时当悬挂状态时,wait()可以用来等待。一旦线程需要继续运行,其他线程将使用notify()通知它. 问: 使用JDBC编程时,如何控制结果集Resultset的指针,使其上下移动,并移动到结果集的第一行和最后一行? 答: 在JDK1.1中,next()方法只定义在Resultset类中,以支持数据指针的下移。但在Java 在2中,Resultset类增加了以下支持数据指针移动的方法,包括:

ResultSet.first():将数据指针转移到结果集的第一行 ResultSet.last(): 将数据指针移动到结果集的最后一行 ResultSet.previous(): 向上移动数据指针

在JDBC2.0的规范中定义了上述所有支持JDBC的方法 2.0JDBC驱动程序可以支持上述方法。目前,JDBC驱动程序制造商,如Intersolv和Openlink,都有产品支持JDBC 2.0 .

问: 哪种Web? Server支持ServletIIS如何支持Servlet? 答: 目前,支持Servlet的服务器端产品主要包括: Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeserverMot Bay's Jettty等. 此外,一些第三方制造商也开发了Servletet engine,使其他Webserver(如Netscaperer) Web Server,能够运行Servlet的IIS等,Jrunnn,如LiveSoftware(https://www.tulingxueyuan.cn/d/file/p/20240225/coe32ezpdvs products/jrun/)等. 问: 如何在Java应用中将图像存储在图像文件中? 答: Java Advanced Imaging API(包括Java Media API)允许在Java应用程序中执行复杂、高性能的图像处理.JAI API提供存储图像的能力。目前,JAI API支持以下图像文件格式:BMP,JEPG,PNG,PNM,TIFF.以下是将图像存储到BMP文件中的代码:

OutputStream os = new FileOutputStream(fileToWriteTo); BMPEncodeParam param = new BMPEncodeParam(); ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param); enc.encode(img); os.close(); 关于存储图像文件的编程指南,请参考以下网页: http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/ 问: 如何用Java语言向串口读写数据? font> 答: Java Communication API2.0可用于读写串口,支持RS232串口和IEEEE 1284 并口提供与平台无关的串/并口通信机制. 详情请访问:http://java.sun.com/products/javacomm/