?? java常見問題集錦.txt
字號:
用JDK實現的簽名applet,不可以在Netscape或IE中運行,但是可以在Hotjava瀏覽器中運
行.
不同的瀏覽器提供了不同的簽名applet機制,如Netscape提供了zigbert工具和 Capabil
ity API, 而IE則需要使用CAB文件. 但是,無論是Netscape工具產生的 簽名applet,還是
用IE產生的簽名applet,都不可以在其它的瀏覽器中運行.
如果要使JDK產生的簽名applet能夠在Netscape或IE中運行,解決方法是在 Netscape或I
E中安裝Java Plugin,則用JDK實現的簽名applet就可以在這兩種 瀏覽器中運行.
問:
用JNI技術可以從Java應用中調用C程序庫,但是如何使該C程序庫可以調用另外的C程序庫
?
答:
如果一個被Java調用的C程序庫C1仍需要調用另外一個C程序庫C2,那么在編譯C1的時候應
當聯接程序庫C2,步驟如下(Solaris平臺):
編寫調用C庫的Java文件,并編譯.
javac java文件名
產生C程序頭文件
javah -jni java文件名(不帶后綴.java)
編寫被Java調用的C程序C1.c,以及被C1調用的C2.c,并編譯.
cc -G -Iinclude路徑名 C2.c -o libC2.so
cc -G -Iinclude路徑名 -lC2 C1.c -o libC1.so
設置環境變量
setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路徑
:${LD_LIBRARY_PATH}
運行java應用
問:
在Java語言中,如何列出PC機文件系統中的所有驅動器名?
答:
在Java 2版本中,java.io包中的File類新增加了方法listRoots()可以實現這一功能.
問:
為什么Runtime.exec("ls")沒有任何輸出?
答:
調用Runtime.exec方法將產生一個本地的進程,并返回一個Process子類的實例,該實例可
用于控制進程或取得進程的相關信息. 由于調用Runtime.exec方法所創建的子進程沒有
自己的終端或控制臺,因此該子進程的標準IO(如stdin,stdou,stderr)都通過Process.g
etOutputStream(),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而java2對簽名機制做了比
較大的改進,允許用戶更靈活地設置安全權限.Java 2提供了三個工具:keytool,policyt
ool和jarsigner來實現簽名applet.例如,Joe編寫了一個簽名applet:SignedApplet.jav
a,那么產生一個簡單的簽名applet的過程如下:
//產生密鑰,密鑰別名為joe,口令為sign12,存放在密鑰庫joestore中
keytool -genkey -alias joe -keypass sign12 -keystore joestore
//將SignedApplet.class及相關文件打包成jar文件
jar cvf SignedAppletDemo.jar
//利用keytool生成的自簽名的證書產生簽名applet(jar文件)
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe
//將自簽名證書從keystore中輸出到文件
keytool -export -keystore joestore -alias joe -file joe.cer
而對于簽名applet的接受方Susan,需要通過如下步驟來安全地執行
Joe編寫的簽名applet:
//得到Joe的證書并將之讀入到密鑰庫中susanstore中
keytool -import -alias joe -file joe.cer -keystore susanstore
//運行policytool產生滿足Susan要求的policy文件
policytool
//用appletviewer運行之,或在瀏覽器中安裝java plugin來運行之.
關于簽名applet在Java Plugin中的部署請參考以下網頁:
http://java.sun.com/security/signExample12/
注:以上的例子為簡單起見,使用了keytool產生的自簽名證書.其實,用戶也可以
使用keytool -certreq向商業CA中心申請電子證書.
問:
若通過ObjectOutputStream向一個文件中多次以追加方式寫入object,為什么用ObjectI
nputStream讀取這些object時會產生StreamCorruptedException?
答:
使用缺省的serializetion的實現時,一個ObjectOutputStream的構造和一個ObjectInpu
tStream的構造必須一一對應.ObjectOutputStream的構造函數會向輸出流中寫入一個標
識頭,而ObjectInputStream會首先讀入這個標識頭.因此,多次以追加方式向一個文件中
寫入object時,該文件將會包含多個標識頭.所以用ObjectInputStream來deserialize這
個ObjectOutputStream時,將產生StreamCorruptedException.一種解決方法是可以構造
一個ObjectOutputStream的子類,并覆蓋writeStreamHeader()方法.被覆蓋后的writeSt
reamHeader()方法應判斷是否為首次向文件中寫入object,羰?則調用super.writeStrea
mHeader();若否,即以追加方式寫入object時,則應調用ObjectOutputStream.reset()方
法.
問:
對象的序列化(serialization)類是面向流的,應如何將對象寫入到隨機存取文件中?
答:
目前,沒有直接的方法可以將對象寫入到隨機存取文件中.
但是可以使用ByteArray輸入/輸出流作為中介,來向隨機存取文件中寫入或從隨機存取文
件中讀出字節,并且可以利用字節流來創建對象輸入/輸出流,以用于讀寫對象.需要注意
的是在字節流中要包含一個完整的對象,否則讀寫對象時將發生錯誤. 例如,java.io.By
teArrayOutputStream可用于獲取ObjectOutputStream的字節流,從中可得到byte數組并
可將之寫入到隨機存取文件中.相反,我們可以從隨機存取文件中讀出字節數組,利用它可
構造ByteArrayInputStream,進而構造出ObjectInputStream,以讀取對象.
問:
運行RMI應用時,可不可以不手工啟動名字服務rmiregistry,而是從程序中啟動之?
答:
可以. java.rmi包中提供了類java.rmi.registry.LocateRegistry,用于獲取名字服務或
創建名字服務.調用LocateRegistry.createRegistry(int port)方法可以在某一特定端
口創建名字服務,從而用戶無需再手工啟動rmiregistry.此外,LocateRegistry.getRegi
stry(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"或"a
4"
問:
在JDK1.1中Thread類定義了suspend()和resume()方法,但是在JDK1.2中已經過時,應使用
什么方法來替代之?
答:
Thread.suspend本身易于產生死鎖.如果一個目標線程對某一關鍵系統資源進行了加鎖操
作,然后該線程被suspend,那么除非該線程被resume,否則其它線程都將無法訪問該系統
資源.如果另外一個線程將調用resume,使該線程繼續運行,而在此之前,它也需要訪問這
一系統資源,則將產生死鎖.
因此,在Java 2中,比較流行的方式是定義線程的狀態變量,并使目標線程輪詢該狀態變量
,當狀態為懸掛狀態時,可以使用wait()方法使之處于等待狀態.一旦需要該線程繼續運行
,其它線程會調用notify()方法來通知它.
問:
使用JDBC編程,應如何控制結果集ResultSet的指針,使之能夠上下移動,以及移動到結果
集的第一行和最后一行?
答:
在JDK1.1中,ResultSet類中只定義了next()方法支持數據指針的下移.但在Java 2中,Re
sultSet類增加了如下方法支持數據指針的移動,包括:
ResultSet.first():將數據指針移到結果集的第一行
ResultSet.last(): 將數據指針移到結果集的最后一行
ResultSet.previous(): 將數據指針上移一行
以上的方法定義在JDBC2.0的規范中,所有支持JDBC 2.0的JDBC驅動程序都可以支持上述
方法.目前Intersolv和OpenLink等JDBC驅動程序廠商均有產品支持JDBC 2.0 .
問:
哪幾種Web Server支持Servlet?如何使IIS支持Servlet?
答:
目前,支持Servlet的服務器端產品主要有: Sun公司的Java WebServer,Lotus DominoGo
WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bay's
Jetty等.
此外,一些第三方廠商也開發了Servlet engine,以使其它WebServer(如Netscape Web S
erver,IIS等)能夠運行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com
/ 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>
答:
Sun公司的Java Communication API2.0可用于讀寫串口,它支持RS232串口和IEEE 1284
并口,提供了一種與平臺無關的串/并口通信機制.
詳細文檔,請訪問:http://java.sun.com/products/javacomm/
--
你無論走到哪里也走不出我的心,
黃昏時刻的樹影拖得在長也離不開樹根。
無論我此刻是否在網,BBS上有我的根。
※ 來源:·飄渺水云間 Freecity.dhs.org·[FROM: lhw]
--------------------------------------------------------------------------------
[返回上一頁] [本討論區]
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -