数学建模社区-数学中国

标题: [转帖]Java常见问题集锦(来自Sun中国官方站) [打印本页]

作者: god    时间: 2005-3-31 01:31
标题: [转帖]Java常见问题集锦(来自Sun中国官方站)
问: 如何设置Java 2(JDK1.2)的环境变量?  
' }* B5 M* b4 U4 Z' \
. B& I% P. A/ C8 z6 ^# v答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  
& ]$ @9 P4 q: _6 W' t* e2 L6 A% ?Java 2环境变量的设置如下例所示:  9 m" C0 h9 i: e8 z* l
Solaris平台: setenv JAVA_HOME Java2的安装路径  * e: U$ Q% }  K2 j$ c$ p0 D1 X
setenv PATH $JAVA_HOME/bin{PATH}  ) X2 S& R. }& w
Windows平台: set JAVA_HOME=Java2的安装路径  ; F$ e6 c0 {0 C" H7 }
set PATH=$JAVA_HOMEbin;%PATH%  , s- Q+ F# V% h: W1 ^. _
4 e% ?4 z! R& Z$ t. S
问: 哪些Java集成开发工具支持Java 2?  
+ @6 b! }5 @5 L7 }, P0 \. ?8 ^+ U# V8 @( t7 \
答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  3 `/ L% w; z/ l/ X9 X8 i
* g: @7 H" t1 U) g
问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  - q$ v+ F" x- `7 e$ X

3 N" ?3 E  q' x' T5 I, i. }3 J4 m答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  
+ L( @# H; p! B4 b4 ]    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  9 W5 j" L- O- ?4 G, v2 r  S
    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  
, p$ R0 a; L; l5 @
8 p8 k  ]5 e, c1 |问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  
+ ]6 z( _6 G- j* y& t* \# g8 e: J: W# q- D
答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  
* s' W8 `, j! n" S9 m/ ?$ |3 I" F' W5 q
当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  7 n$ j2 ^* l; S5 E- F/ C1 }5 D
4 G- @5 F4 @4 H+ ~; D, l) \3 H
* c) _5 O# L0 `# _1 B. [1 ?
String native2Unicode(String s) {  + y5 x+ ]' ~0 L0 T( H
0 F& y( u4 ]/ v& k, z# P9 j
if (s == null || s.length() == 0) {  
- ?; Y- B- m" N1 ?* \0 k7 Z* v1 l9 s  u
return null;  
: v/ n+ L& [) l! p) A3 F( W2 D: l0 }, P* _8 c" ^% E
}  
# M3 P5 B+ m6 p( v5 }0 Q1 F: N) z2 ]& m$ o4 }4 H" q9 L* U+ `- r% N
byte[] buffer = new byte[s.length()];  
( M, }0 S" l) E' h+ O) p& a3 [6 Q7 M
& s# O3 F0 C& o+ r- j% _for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  # S+ c' d% `/ Q8 A
" @& u. b' a! {2 ^7 |: D2 t
c = s.charAt(i);  1 _7 L4 O6 G2 t8 Q9 R  \$ R2 t: \# y
; ~- b, ]0 g: [
byte []buf = (""+c).getBytes();  4 E) f  V. D5 }) ~# j8 N1 c
8 B$ v2 I& Q" [6 V& @
buffer[j++] = (char)buf[0];    n% M: I+ D# J4 R; I) H7 M# c
/ w$ `, l! [2 f0 Y! N1 \, }
buffer[j++] = (char)buf[1];  
2 H8 N0 B% F9 b: K# u9 ]
% b  \/ L( |# [5 y  i/ M}  ( Q; C. e. ?8 c. B+ L
& A, q2 s+ R4 E2 X- i+ x& I7 r
else {  4 B! R7 `# @" A3 A) a5 h

5 [6 A( W' }* n% U: {. r  Z/ O; Ebuffer[j++] = s.charAt(i);  
6 @1 Y+ W: k' ?3 p: [$ K. s+ b
, J0 p- N3 J# [% t6 u}  
0 e" x' {  E, Y
2 O' U  B; S9 [# G$ l$ ]}  
( f+ N# ~9 U& I9 R: D$ `
" i; ^) @1 M5 b' p+ L" greturn new String(buffer, 0, j);  
" f/ b9 ]" A4 i* N  u+ L* H  J) U) w# |! T+ w) x7 B
}  
. \9 X1 z6 ^" A4 s$ D- B" d1 C: J, B  v
除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  
" Z0 Z  x8 U' `2 ?4 O
8 O; D& J+ d  L: q( m4 t
  w5 q# F" Y, |, v2 t' l4 d' W问:  $ f5 l5 C4 t2 N3 n% b, X. Q: u
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  , V! z) S# z! y7 ?
$ M( e7 ^: _  L5 h% ^# X! j
答:  9 y) t' r/ W( h* [) d# }
javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  
; a/ w8 ^4 B8 D9 T
# D8 {' e. l# H% h$ @+ P( W6 B9 O
- [6 l; X7 F& F! Jpublic void doGet (HttpServletRequest req, HttpServletResponse res)  4 t: c6 i. I, [; ?: V& k
' Y/ ]3 @% \% B
throws ServletException, IOException  
0 N/ e8 @& g8 [) j
. _& o: X% {9 p' d3 @6 h{  
' _3 N" ^: ]  w5 D# q8 _1 h7 \" Q" c4 P- q  I
res.setContentType("text/html");  & U7 ~2 B3 \& p5 ~& C- z5 O; q
4 p/ g3 |+ J0 w$ `) |7 C6 ~) C
ServletOutputStream out = res.getOutputStream();  
/ W3 z2 {: `+ }$ f# V
: I' _" `! J7 x) j8 _( @OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  
, L6 J( [' _% {0 Z2 `7 g7 ?" v
4 J3 K& d. A6 r- G1 {  \ow.write("这是测试");  ; z% h; [* k3 V% ~; e
4 j; h9 g$ q- U  Y& B! ~' s
ow.flush();  
+ R8 [, X3 T* x5 `2 z) X+ h- S  j. B5 F  z
ow.close();  
; _9 x, z% `- j
5 m) @; x( k' C0 E}  
0 v* l' r7 ~. a' ^6 c' ]' t- P( j
1 s+ o9 M, y2 |+ I( X. C+ k$ G/ h* R) ~' G! R' X1 I6 Q/ B
问:  
4 L) g: c' S( N+ R如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  ' z1 c5 k5 W% v1 o) I" ?3 d$ r
$ C7 r( r4 K% d1 q, _
答:  
, P  p& t# i# I; C/ S3 x- d3 N3 p有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  ! ?3 n/ k! z: ]" o# m
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  
. V. I" C  \, c4 C0 {4 A修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  ) K" b7 F+ j' w1 [6 V# X1 |, g
$ K. @6 s9 X: Z0 a% a/ m
, X% P% G. d5 t7 D
问:  7 Y: Q: r7 @6 N9 S) Q6 j4 |. m; [. F
为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  
( d- o3 |; k; ]1 i
7 G8 A* @4 U/ y6 ?8 q( A2 N* t答:  
- d' p0 m: z9 n* V6 |2 U4 {3 ~机器的网络设置不正确很可能会引起该问题的发生.  / ~* {) m  E6 ^& M$ i/ i% {# B9 `
RMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  # L$ B+ o2 C8 C7 a# l3 Q4 z
# U+ r5 P5 S, C
如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  1 u8 P( I( T, T% W, `
% `* B0 r$ n4 i; j* Y/ l% M0 f
IP地址 主机名  / p, S% b4 e4 m2 Z# H. {! T+ J. }, p
& l0 c+ H& l7 `" u0 c) R- ~
如此设置应当可以明显地减少查询所花的时间.  ( C7 n. O" h! \) y

7 v* e+ E" S! s" Q$ h8 Y) W) ^问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  
+ z6 w, Z* {% u- a, [6 h5 d% C: G+ B) W
答:  4 W4 \4 @4 C$ u& ]" }
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  
2 d7 i1 T3 `4 u- h3 m% O& @$ X4 X; s. T7 f# y* M9 R7 n

  A% {# `- C  j/ M! ximport java.util.properties;  ) |. y! D" N  H! K% L( \1 _+ g3 X1 L' s

& c0 L0 V+ S  P! S9 a1 a.....  
( e5 w2 H3 l. I0 j/ o0 a) D: b% k' g- r& M/ C( q
Properties sys = System.getProperties();  : x( g2 Y% v: ~$ W9 U# ]8 i
8 {- i; n2 i/ j1 g; ?7 n7 c  X/ U
sys.put("proxySet","true");  
! i9 c! m2 t2 B2 K) `% ^
$ G) I7 ?1 F/ D+ Jsys.put("proxyHost","myHTTP.proxyserver.com");  2 f0 P' j0 n" J' Y- p* G

+ n" C3 x2 R/ L/ |; a' f. c% X/ Lsys.put("proxyPort","80");  
- Z2 x" z( c; F2 o) J3 S4 Z" K/ T% J- K1 F* m; S  N; }
System.setProperties(sys);  
/ P& e, I4 ~. o3 B
, N; e  S, o' q4 z+ A% Q
- Z9 r! E. c: Z- W0 Q/ [2 o. G+ D, D7 V5 r
u = new URL(website);  
# W$ V8 }- s/ n- Z( S
3 s. S9 u7 s. J1 f0 sconnect = (HttpURLConnection)u.openConnection();  " s7 l( f3 E6 k  C
, @  ]. ]% X7 h7 X5 O6 F) N
.....  
) @6 k* l" F! |. p8 R
' F# E7 j( D' A- P- v# r! B问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  ; a) ^$ H  c  m9 K, P* U0 e2 ^4 X
- I9 M( c) D) C
答:  ) {. A$ l6 a# ~" I
JList组件有一个单独的显示模式ListModel来表示JList的显示数据.  9 ?6 m7 a+ W2 h, I8 }1 Y; Y
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  
" F+ @9 `+ k' l# I: Y* P; Y7 M# G+ zJList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  
. L" J! v; @. k当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  
5 v0 |/ {1 z9 \) p' M9 P- M7 Z8 v2 A; j' h+ P4 n
问:  
: G5 N  ?2 q, B+ u7 q在Java applet中如何实现一个模式对话框?  
* C1 H. k" M0 t. d8 u9 j0 Z3 b; D" m  Q/ d3 O5 w. T
答:  
) Q; j; a" T( D9 ^5 Z在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  ' @' Z* K2 [% F0 D: x& ^: c

% s" c' j- L( X
- W/ B2 Q. p" _" H: e1 l.....  # X- R" \) `' Y  u. N0 p

( I5 x# V" d8 bDialog d = new Dialog( getParentWindow(comp),title);  0 b8 A1 Y7 N* r1 \9 `
: g' K# t6 d+ C) Z+ @& z
// comp为applet上的任意一个组件  ) F% y3 O- S- f
6 L- ^6 u% O0 ^* ^; w
....  : U, A% v; x( j; \& j( l4 q

9 P' G7 p  Q/ ]# j! e1 ]  Z; z' J( ~& c2 G: G' O) ]

) j" E2 w. M& mpublic void getParentWindow(Component compOnApplet,String title){  ; V0 L( K5 U+ M/ c! }6 T
  L7 j4 B! L/ r% P- e+ T
Container c = compOnApplet.getParent();  
. `. m- p$ Z3 C+ S' s% h9 w; K" y; ~' @3 u5 x
while (c != null) {  - s8 T4 N( |5 j. c- E7 @0 j
6 q/ ^0 Z1 h  A* s. n
if (c instanceof Frame)  
: `9 r+ E6 A/ ]" u* h; G  r5 F, g6 z0 W' q7 N
return (Frame) c;  $ O4 t& y* Z* g/ M' {- P

" x/ P4 T0 A4 Ec = c.getParent();  
9 f" j0 }7 P+ ~$ t% F) Q/ a& C& }& I9 K! ^
}  
6 i: V/ c1 ^2 y. h& a7 W/ k5 U: u5 H' a( a
return null;  
% k4 ~7 p/ _5 c* S+ B  c$ R/ C1 D0 R6 \$ O8 _' E/ C
}  
5 P5 r( v! t0 F  M$ ]2 c
' t& L4 [. P+ B4 T9 }问: 在Java applet中如何显示另外一个HTML页面?  
6 S" q, G7 _# {* H( B% `: h0 p# J* U3 S2 G. q9 v, j" ?
答:  
( M: \6 `+ b% T通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  
1 o! @) t" b/ F& k, H
7 |/ D8 x& j% w  e问:  * ]# l2 E9 O* e' ^' e
用JDK实现的签名applet,可否在Netscape或IE中运行?  
' d  N7 Q  m  z) V  {" k
5 y# O/ d+ [; b2 K2 u& S; g) m! z答:  + W6 v/ H! ~2 V, |+ J( M
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  9 a& R$ B" J6 O7 A. {

1 u- K- o. y$ w' v不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  
0 o- U; }# j0 V0 b0 ^( B+ B! [1 e8 C6 x% h9 v1 K
如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  
% z% _- }) A) M( z9 M- r) J! i% `
问:  , h5 t2 o3 v4 ]' c
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  
& s# e3 ^( R1 ~" }0 [4 D6 }8 m& V) L1 Y7 Y; U
答:  
/ P  }6 q( w/ q0 @' f% q  ]如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  * B& V7 I% I  v, p
编写调用C库的Java文件,并编译.  ; h9 }& `" d7 X- @8 J, j# C. V
javac java文件名  
9 j4 p3 }( D: b9 \4 ?4 s
7 e& v2 h/ ?# k" c5 \; C
/ J+ K, H7 R% t& J$ U产生C程序头文件  
- t) P4 g& d+ ?# E$ ^2 F6 Ujavah -jni java文件名(不带后缀.java)  
3 H9 V. b+ y3 I
2 G; Z3 k! S7 t( p. n
$ W- h9 Y. }9 S8 c" o7 e编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  
1 _! |% J8 `+ ^8 m% X, u' J" j; ^+ e: Pcc -G -Iinclude路径名 C2.c -o libC2.so  
8 q+ J! N1 }9 d( r& S, O: fcc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  
/ r. j5 }& n9 Y3 l: H) t
/ h$ n1 K* K  W- k- S; O
3 R0 |1 c% g- {$ n- r: ?% y设置环境变量  1 y: S4 ?% ?/ i6 e+ M
setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  ' w2 [) n4 x% a1 R3 q. w# t
{LD_LIBRARY_PATH}  
' t9 a7 q" P  a, [2 x: a
+ w+ Y3 \4 a( ?- D0 l
7 N/ w& o) U  y! W运行java应用  4 e) B' C8 ~6 h+ \. N2 O

5 p" c& h( z4 {) U6 E) l/ J, _
6 R, @2 N& m+ ~' b" i, T问:  
0 A' q/ C; V9 g  C( ^" b3 h# r: o在Java语言中,如何列出PC机文件系统中的所有驱动器名?  
) Y- S' G0 m/ }9 g
, L! t7 ^. a& {4 C3 p答:  
1 y, y; W$ t, {2 P) \% M. g在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  
! g" x+ }, m6 n! A
5 z- g4 G+ M6 P- `问:  
8 [& [, g' u7 _9 V. }3 h( [为什么Runtime.exec("ls")没有任何输出?  ' b1 m. K; B+ D" e) c( z% Z

5 n- \4 {2 l$ l' P" m, p! m9 S答:  
/ F) r$ }% q( g2 W; V0 m+ g. U* ~调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  8 z$ W3 f7 n" ?5 W2 C5 K/ |
5 a. X3 p7 t: V! w. ?
( Q; f1 A' f( d" g. t
try  + K7 w# @6 ]$ c3 m6 E6 O
/ u, |" R' D3 q3 B
{  4 u7 q, p1 C7 ^; E

( e0 R9 ~* i" w- w; K# fprocess = Runtime.getRuntime().exec (command);  8 ^$ H# M$ U% V6 ?; W' ^6 W
# \, g  d2 k' }  A0 Z$ p
InputStreamReader ir=newInputStreamReader(process.getInputStream());  0 i( c& K7 q+ l4 ^3 c4 ~
2 O6 L) m" L% i8 I/ o0 X3 Y9 J
LineNumberReader input = new LineNumberReader (ir);  , W2 ~4 R2 B* |

! C0 o; H' R5 r% Z. F+ _String line;  2 T; e* `* q. h+ M3 Z; `1 E
5 ^( N5 f" q" w( Q: l3 ^9 R
while ((line = input.readLine ()) != null)  
% t# M- Z( K# c
- b. ]5 @+ \! s4 ?. q5 d7 tSystem.out.println(line);  
7 Y; ]/ |  [5 H. h# R2 a1 k+ e$ a* S3 e  H
}  . T% \+ n9 h- `# Q2 v/ H- }$ _5 {
" p1 @' E7 G( }
catch (java.io.IOException e){  
& N- i3 r* W, ~- p1 K* M% n# E# t; Q0 B; e
System.err.println ("IOException " + e.getMessage());  
& Z' A" ^1 |3 W" o  m' v: [& ^5 f) Z+ t% M' ^6 t: P) H: K; T9 U) y
}  
( L: Z- Q( M' u; n* N) N( c# Q9 l7 J% ~6 J
  R" h% D& K2 F' r5 \5 I9 F% U: o4 j
问:  
* y; L0 ]4 V  P- h如何产生签名applet,以使applet能够访问本地资源?  
( a: V) o' v9 ?# h$ S/ E6 n* d. r) b, \" a1 Z5 d; W
答:  
& h% G$ J( q! T+ t9 G在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  - D( j4 }: Q, H8 s5 d$ R
* l- M- L' [1 u
+ M4 L/ p% g' m* \
//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  " |1 t* X+ J, y- z" Y; t9 j4 e% m. t

2 N' [/ A* f2 B* w9 okeytool -genkey -alias joe -keypass sign12 -keystore joestore  
& H& ~( v7 J$ g/ B9 q, N, x( q5 k# R3 M, I
//将SignedApplet.class及相关文件打包成jar文件  
9 G9 J% K/ r3 P  F
1 M2 Q9 h% g, s4 kjar cvf SignedAppletDemo.jar  6 v) ~* ^4 l, q7 F3 @
# U/ Q" X, g1 @& o* Q+ t- z& a
//利用keytool生成的自签名的证书产生签名applet(jar文件)  2 F: n9 y: h1 B- V7 n
  j5 z, ~! j+ R3 F* T' x& L+ v
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  
2 i/ u: \2 x. Z1 G8 d2 p: s. z/ q/ |8 W2 _
//将自签名证书从keystore中输出到文件  $ Q% G, G4 E. L+ X) V. [- G  T

; r9 S( _% |( u" w* _* V0 |keytool -export -keystore joestore -alias joe -file joe.cer  
# [  y0 N4 ~: s/ \1 j; h  w! n+ Y6 S* E

' K7 E, U" N! y- |
* k( y9 u8 y0 w4 h6 H6 C6 E4 f2 c2 m而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  & y/ r3 Z7 m! ~

: n& [4 T8 t9 ~- pJoe编写的签名applet:  5 K) h1 c/ t' `: Y2 x2 D

$ d. m' S' j( j5 `, H//得到Joe的证书并将之读入到密钥库中susanstore中  / `" A5 j. @3 p% J9 ^+ \

( ?: Q$ z& L/ w! V1 ]" [* {keytool -import -alias joe -file joe.cer -keystore susanstore  
0 A$ B+ z1 P! H6 _; N5 K8 X
- d' y- X, R7 _/ ]0 Y//运行policytool产生满足Susan要求的policy文件  
) \2 ^) y$ N- e* d- M( b; Z7 q( V0 t5 ^% F6 ^4 e' S0 f) ]
policytool  
( [. c# m3 T% P; _0 f  d! C  _9 B( B2 Q
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.    H, J: A( R, A
, q4 N! [7 O& r& l0 W

( x+ \$ v3 r/ S, O9 o* ~- u
* W& y9 ]1 D# C* T. K: @: G1 h关于签名applet在Java Plugin中的部署请参考以下网页:  : ]7 f* i/ j1 [! V& }% S
9 R& s( S9 x! A7 A
http://java.sun.com/security/signExample12/  
+ ^( a0 Z0 w% R% n* k
% c8 B) Z5 W( D+ B: ~8 k' f: _2 b( C7 m
6 t0 _- A8 e8 K1 y; a- A
注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  
7 [7 L) R, C) z9 d' T; ?6 i* ]9 F7 b0 @5 ^" `# y, k/ N
使用keytool -certreq向商业CA中心申请电子证书.  
$ V6 [4 ^- h/ I3 ?' I% r- Z# L; I' v, s2 ~( I, L5 A

& z8 m* u( a0 _  |( X& \
$ G# ]6 E4 g. i" B# Q3 U
8 _% |; c: O$ v" o4 `* C问:  
  M4 }! d4 _- q& [0 P; L7 Z若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  
( X) v) a$ R8 M& u- H# X( v, w/ g' @9 |9 v/ g
答:  
7 t0 w' V4 B! p& P3 k: S' I使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  7 ^' o  @8 W) r
. k5 V' X& `* K& E! U- n
问:  
2 w6 @* q' L+ h对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  
7 d; J$ G, f, [# R/ _, I
2 ]0 |& l5 Z. Q  _- [; L答:  " X$ n0 n+ c# y2 s% T- h
目前,没有直接的方法可以将对象写入到随机存取文件中.  
  }6 x2 t$ [: J: O: ^0 i. i6 h但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  
: U! @) B* F3 p6 a
' k+ m+ ?1 b/ [4 h* U问:    I6 v5 A0 r' c% K* {0 |$ ]/ A% c
运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  
' Y2 h6 B7 `! m+ B2 _/ Z; F
' S" Y) z/ Z* A" y' N; o( f答:  . X" n1 v9 n1 p2 c
可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  
2 \8 c. ?' f4 K2 ]$ m* R; Z% h( k9 Y4 a# x* h
问:    D* q9 \4 r$ s# m
使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  5 c9 q- e" t0 J' |9 U

  f3 W  p# m3 q: {6 l8 c! ^. H答:  6 ?* ^+ p# {) X1 P9 X- D
使用如下方法可以获得PrintJob的实例用于控制打印操作:  $ ^. y. }, U- b8 o( `. B2 t. H

2 R% Z  ]9 j- J9 h; d0 z2 i7 ]& H- j
Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  
; @! |9 K+ h( O/ h' Q
: p- ~, U* r0 ^1 J3 p/ G那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  ! N% ?; b. I. g0 I$ m0 J

. S' a! y0 K* Y- qawt.print.destination: 可以是"printer"或"file"  3 C, f& L0 ^4 o% s+ D: r% W/ ~+ C

9 ^2 T1 d; i9 @* ]+ k! t5 tawt.print.printer: 打印机名  
5 m1 R5 h) k0 f0 C. p7 w9 n. K) J- v
awt.print.fileName: 打印文件名  + ]/ `  a0 L  r4 S
) |# {% k& B- C* N* o: P) \
awt.print.numCopies: 打印份数  8 `. |3 T) o! ~& M
6 _1 z3 X# f1 h0 O: R
awt.print.options: 打印命令的打印选项  6 w8 r; N: f7 ], q

: V6 [9 R! f  ]1 a7 \1 Fawt.print.orientation: 打印方向,可以是"portrait"或"landscape"  . Y4 |* c8 y( x2 R; e- N. z' `
  `- C& `  W* k; F
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  
8 |) A6 R3 m% k$ e8 C/ c6 o& A. z4 L# h- i0 A3 g
/ S8 u7 ]4 W4 F- ?
. `! ?" V  \+ a

( s1 A' K" T; U2 c5 O9 K4 K% x8 |- e, _" k/ g+ e" S4 F8 C9 Q

3 `, g4 d2 D- r- _问:  2 J/ s, R0 i1 r/ L% C
在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  0 v6 l( F6 n5 Q" \

& Q& V# d1 N( o4 j: P7 _+ [2 L' \% u. T答:  
1 G1 I, K: o5 N& Q1 PThread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  
# m4 ~, {; k1 b, s! u+ g
4 _( |* h! W2 F+ s( c. f因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  
, J/ s) \2 v% L  E9 p1 ~
* w& E2 B' R& ?& W; a1 i问:  
# X! C3 n3 g+ P' e6 C( t使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  9 Q: @* A8 Q: S* U8 T3 Q" G) s7 x

+ g* o8 \! S5 y) D2 L# k答:  5 p, I+ D  f# c
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  ' k0 s/ }( Q) \7 s" g

8 ^8 f6 m2 A9 Y- I; Q' i6 `8 r' U; }$ C% s: I* U% q" s
ResultSet.first():将数据指针移到结果集的第一行  
1 W" n/ D+ D! |# {% o- A( M- Q- s( K8 {- m
ResultSet.last(): 将数据指针移到结果集的最后一行  8 `" S, g0 R  T4 u5 c$ [& I  W5 e
; j& V/ x" I1 z8 D" f: Y; |
ResultSet.previous(): 将数据指针上移一行  0 f) A9 ^( s- N- y% p9 L
  M7 m& H. K" ?) G

% M( y2 Q, g1 R% X以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  
" N+ o6 e+ d2 v2 X, N/ ~* ?/ @  q: W. V" |" Z* ?8 M, a& X; O
. }( h. V* v! P+ k7 |5 g/ l
问:  : Q4 R& z6 [5 K+ [* |+ i, z
哪几种Web Server支持Servlet?如何使IIS支持Servlet?  
4 g* ^% K  [; M- [% k* N
3 S- J: A) V" b. Y# k( G: Y- E答:  ; _6 |: S- w( ?4 F  h
目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  3 ^1 R9 U; Z7 l
9 x( s; o1 j$ V& x8 {$ i9 M: L5 \
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  , G9 j* `; w: J7 a

* n- A' B6 H! d7 e4 R; r, b问:  
. C* B- {+ U+ A7 t$ y. E: |如何在Java应用中将图像存储到图像文件中?    L4 k- J+ b' |$ A  l1 q9 n
  w- B6 F: {1 M
答:  * x/ e  k* m9 X7 K& Q0 b) n
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  
& |- T% W. v5 ?: F. w; _- L" _7 z- g+ U
3 j8 Q- A$ c* r3 {  v$ |% A
OutputStream os = new FileOutputStream(fileToWriteTo);  0 B/ S/ O' X# g. b; ]6 n
# {+ B( o0 u6 j  B2 t* `
BMPEncodeParam param = new BMPEncodeParam();  
  D4 ?1 {6 H0 [: P7 N; _! u- ~- ]9 ]) y8 H5 `! G  Q- `
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  5 G% ^( p4 ^% C, {% @5 y
9 I4 |4 K: b+ W5 q0 Z' S" y
enc.encode(img);  
$ Y7 a  h3 E% ?0 i9 O; e+ X' u) t" o8 k8 ~! c. N
os.close();  
7 R0 U& n2 _* A+ Z( f) n' b1 L
* ^/ n; C- Q2 y" |; t. t9 y有关存储图像文件的编程指南请参考以下网页:  6 P* N  u) d3 k: Z
2 M! f5 S$ m$ J8 A4 t
http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  
' R5 _, U# P7 }" @" s8 g
( R0 v1 m$ l- ]/ q* b, |1 j% x9 a9 L; F2 ?( B: [( a
7 x6 \5 z6 V, p. o3 \8 b$ O
* R3 }! J: V5 s# M0 t' u1 }, o
问:  
& J1 y0 ^- E- s如何用Java语言向串口读写数据? font>  
5 f' v& \3 q- i6 I4 y9 I% r  E" h. h& w( N% Y2 W1 V0 j+ p/ g5 g
答:  3 G# D* i  N, [7 Y
Sun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  # v- K$ k: S# \
% ?# m0 d7 H; a( r/ M
详细文档,请访问:<a href="http://java.sun.com/products/javacomm/" target="_blank" >http://java.sun.com/products/javacomm/</A>
作者: wangyu249    时间: 2006-11-21 15:02
<p>&nbsp; hehe</p>
作者: wl820609    时间: 2006-11-29 07:21
<p>顶!!!有最新的没/</p><p></p>
作者: deven1985    时间: 2010-1-6 00:44
楼主辛苦了,现在先顶下,以后慢慢看!




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5