QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4971|回复: 3
打印 上一主题 下一主题

[转帖]Java常见问题集锦(来自Sun中国官方站)

[复制链接]
字体大小: 正常 放大
god        

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  % U5 f+ Q) v) d; V7 B

) ^) A- x$ l4 ~. r! Y2 `& f答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  
4 i- q+ @/ s1 |8 X0 uJava 2环境变量的设置如下例所示:  ' c$ \/ P- g# G& ?$ C: V
Solaris平台: setenv JAVA_HOME Java2的安装路径  
' F" |' R4 c/ H+ a, ^) h% _setenv PATH $JAVA_HOME/bin{PATH}  
3 I3 M( _& `$ O: {Windows平台: set JAVA_HOME=Java2的安装路径  
2 }8 N! z: {  P7 [  S. jset PATH=$JAVA_HOMEbin;%PATH%  ; V, o$ M7 L' u4 h0 E% R7 e

, A% k3 X% _" j( z1 S8 R8 U5 H问: 哪些Java集成开发工具支持Java 2?  
( _4 E4 [, V. E. j; C
3 T6 l) V9 A+ I- Y; S答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  
0 q5 S* x: W  Q# z
2 F* l) n7 D9 D9 Z9 Q: `问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  & _/ P; J* r1 M; c7 w

" c" \" l0 E0 E+ i答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  
! {- c- I. o# m9 Z( X    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.    n; G- J/ D# }+ P! Y6 @
    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  
7 h" \! b, j! Q0 i7 E' O4 s' v. y( p; [* r: A' e
问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  
+ P1 {& S* N0 B
' M$ G3 K* t; S5 s5 r5 T, h. d6 ?答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  
' i* ?! I1 Q0 r4 i1 P1 U6 [) y4 i+ N
5 {1 g& E/ j' F( X5 b当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  ) X7 N. w0 f5 N

5 q: t( H; R& |4 a, Q4 _# g* H  H6 R7 C
% h. u- W0 _9 P9 h8 W; pString native2Unicode(String s) {  * X9 o) ?/ ~( c' s

( m# f7 k0 c8 M, J, L2 sif (s == null || s.length() == 0) {  & W  J0 ]9 Y6 k" I+ Y

* k  }' l  g3 ?$ ?return null;  
8 a+ b0 G" g* l2 |
3 [' [! C! m! X5 Q1 g) p% b}  
: o0 t6 l5 h5 y; C4 U5 x- o+ A1 T& v5 d1 X: {
byte[] buffer = new byte[s.length()];  
& V0 r) P% d& j6 ^3 z, K6 a+ S: d  R. |+ ~/ x
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  7 u; \& Z0 X! }  l
) j; n6 K' m* B) d) V
c = s.charAt(i);  * c1 P' h) _9 ]8 h
, b& V* a# S" X+ h
byte []buf = (""+c).getBytes();  ; x5 B8 g; s  x# C( C- o

( L) I7 W7 E% U! l. l$ ebuffer[j++] = (char)buf[0];  ( p7 B) A( K2 U# n5 Y9 u
' D0 ?7 M4 b# P  H- Y6 m
buffer[j++] = (char)buf[1];  
$ \& K4 i% @# O* s3 R. z8 j* P$ H/ v) W+ e) J: d5 R4 G: w- y
}  6 N  M2 }5 t( |6 ^# K% D1 l
/ Y5 u, ?! U5 n
else {  * f. a; [) D  E5 p
; Z) j+ q: K- |4 q
buffer[j++] = s.charAt(i);  ' s; Q# x' }0 \7 G

* o7 o' o, I, J: Y- T# ^- ^3 ~" y}  
2 k. D5 [0 b$ ^+ }+ X% ?5 V# _% u% N! Q+ d
}  5 L4 P" X: ~) q+ s# B

9 v/ D! I7 [, u3 p1 a/ Dreturn new String(buffer, 0, j);  
4 z. s. u2 W2 a7 v5 }6 [  }; z* z
( Z( O7 V6 c+ ]$ `9 B+ C; F3 U}  4 n+ o, K! P% L% I  W6 m
8 m! X5 O% t$ H& L2 R
除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  4 L9 d; W" i1 C$ e6 C0 R9 Y+ h+ H
# i" g4 `  H5 L$ s2 J( g4 S
: x4 ?/ U( f7 ]: j3 N! w- |9 q6 G6 W
问:  + M3 b: Z' H% s- r7 C. d
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  
2 j- ]: p/ K9 Z8 I: s: B: }0 h) [. X! G
答:  
" v9 S  m/ N  Z# kjavax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  
( |& ?+ N8 D! a/ A5 K1 K1 o
6 ~5 N: }' S! v$ ~1 Q5 M& F) D- I0 {4 X( ^8 J3 N# @6 ^4 o% x
public void doGet (HttpServletRequest req, HttpServletResponse res)  
; H  f& Y2 v# F# W* b5 z5 T
# [7 Q6 h1 ?3 O7 a; Othrows ServletException, IOException  % K4 `! A1 K3 W9 Y/ W0 ^* `

+ |/ [4 m1 d3 x0 }2 Y{  ) w1 W( }" ~4 H8 c
' `. ~' c; q. g- k2 Q( V, k
res.setContentType("text/html");  
+ @2 X- K' J, s) v8 `1 b& T
( g, c- Q6 e7 a' W1 O+ {ServletOutputStream out = res.getOutputStream();  ! p' d; m/ @7 n& |1 `

2 l  M, H: E/ m& `OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  
: }7 R. M' h! N$ @5 @
2 R, Y! y/ H, U+ J6 d) m" C/ eow.write("这是测试");  - q" f9 v& H( K+ z4 s+ f

( h- E. @5 t3 P& n, Vow.flush();  . v- E% f9 o2 e6 S8 E- k# p' z

7 t* q+ o4 K* q8 g; @# q# G3 Uow.close();  
5 Q$ k9 `% L1 P6 a1 h: M0 o
8 T4 Q( J+ R- _% Y$ l}  - P* }) ]' K0 H6 `

$ O% }+ _, S* u9 T5 ~8 d% h4 i! Y6 {; X  ]/ Y2 e
问:  
  H4 [' b- E' J/ _0 v8 {* v如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  ; ?0 U% L( p' E( H! W4 y3 `$ G; |( l
8 n5 _9 A* G) c. u8 F
答:  
* @% i. b# j. N0 `9 F有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  0 r- N) @/ r0 ]6 G, P- X# I
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  6 E) r( q5 z* T7 [  S
修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  1 A. `2 p1 I6 @& v% P8 [
" K7 P$ M! X- E5 B) V3 z3 }

8 L5 G1 ^* M! d8 t5 R5 l8 w问:  & o) c0 G  c) M" l2 q' B  C
为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  6 @1 C) K! J* V' z
7 e, f3 r& \& C# O
答:  ! V. m. z; z6 S+ T
机器的网络设置不正确很可能会引起该问题的发生.  
) ^7 j% C6 w9 u: C0 r% W: TRMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  6 \2 u, @8 e0 c4 Q* z
1 p$ v, K( C, a8 h
如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  5 F6 ?% F! I6 S. r6 D7 m+ A

6 W" ]% Q7 G* K) kIP地址 主机名  
$ {/ R: z& A2 q8 e# |/ c- g" b! T% X* A/ g; x. }
如此设置应当可以明显地减少查询所花的时间.  , g7 b! O5 i* [; O0 \4 l% S0 |

  J0 @6 N. {! M) x问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  
8 T% W) I* @% ?+ O% _* g3 g% j. @; ?- Y5 O5 i7 X
答:  . U$ g+ Z( V* R; @" x& Z
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  
( y6 o  X8 C4 b, b5 K/ G* i4 `; _' B8 _( W' H9 r

$ g0 L+ i) ?5 T) p* wimport java.util.properties;  , T% ~* Z9 S/ Y) E. D
& @3 v6 L, J/ |3 C9 O: k) S
.....  % m: W& o  U, X

8 [. Q* r0 q5 S- ^$ i  \8 F& C- j- WProperties sys = System.getProperties();  ; r) o  Q$ _$ ]0 ?
% Z7 m  ?" X3 M, a: G3 t' s
sys.put("proxySet","true");  ( o% P9 f- T% `1 |/ y8 H! b8 B: ^

; H, T2 m! q( \6 S  x3 {sys.put("proxyHost","myHTTP.proxyserver.com");  ) {5 u& I1 b. u$ ?  V! ?
. [0 t6 U% Y& y3 U& r1 P5 v* S  ?
sys.put("proxyPort","80");  
1 M& P0 [$ d3 z" i# x+ r
/ x0 I2 v. L" U- V. KSystem.setProperties(sys);  
2 I$ D2 b- l. A% k7 _: {5 {) w; N- D, _  O( y: H9 w+ u6 J

* Z& X! `5 R# m# ^' \+ Q4 ]2 r! X% [1 P7 @
u = new URL(website);  6 N" [, y3 E5 }" u! z% d

& r# P  p. Q/ E8 kconnect = (HttpURLConnection)u.openConnection();  
2 z, ^; t; W! k' I2 {5 C6 @! B6 `. W7 @5 _9 _; F1 y! G3 X
.....  
5 [% g3 }- q2 n- M) `- i4 e) h" O; ]
问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  + G" Y2 O2 V8 N( \3 H- y

1 z3 y! K8 V$ t( l% A答:  * {) N3 `: U4 g- Z4 \6 P0 G
JList组件有一个单独的显示模式ListModel来表示JList的显示数据.  # a. n* x- s" C, ?! I
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  ! c. J% Z  u" v1 L" x
JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  9 \% ]. s0 L5 @" N2 w7 V  B
当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  8 r2 Y& d: q, Y! J8 P2 p( k
- z4 k4 L, i6 l+ D" ~$ }
问:  " m4 ~. j8 w: H+ `  ~
在Java applet中如何实现一个模式对话框?  " n3 l  f% u% o" ^- p% G
; w- U8 h8 K6 n/ \( u
答:  
! X! i4 m! D0 h; h7 }. t$ |% ?在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  - q0 g& Q& f- S* x$ `: Z9 [* [: D
( C' |2 I+ O1 f
2 u+ t) b7 X; U( s! Y7 S2 Q5 [% c+ _. c* ]4 Z
.....  
; [7 o, M) q/ d0 I8 H5 c( f1 Q' g- ]0 [+ _; j  e6 f
Dialog d = new Dialog( getParentWindow(comp),title);  : t. e* a9 [" Q

1 h4 g9 s& L- ?( v// comp为applet上的任意一个组件  
$ |, F8 R% D6 O' V! \4 r' o4 U) U3 f$ _& f( R
....  : s1 \& E3 l/ p
4 _3 r6 o3 s+ I6 B' N/ u  ?

! i6 k6 \8 c- {' L/ q$ _, ^! O* j* I5 j" H, U# [' u: O
public void getParentWindow(Component compOnApplet,String title){  , Q8 }1 y$ K' S5 H0 T5 j/ J

& k! d! E. x9 G0 p% J/ MContainer c = compOnApplet.getParent();  
) E; e5 ?6 O& g% e, z5 s( h8 ^1 n$ M! g& R6 R
while (c != null) {  ' Q2 M% D2 e/ L$ x) B
$ e0 \- f7 h) N# N) w
if (c instanceof Frame)  - h6 i0 A- J+ m& S; m  q
& p: y" H4 ^& `7 B' ]
return (Frame) c;  
+ e; u* y; O$ H9 ]
6 H6 L* U  k% @, Z- g  O, M% z) kc = c.getParent();  
$ y; M: t: {  u7 i6 Q8 K6 x* L& r1 y, u, {# b+ p, p0 p$ W5 X& z/ X
}  
, u+ H# {1 I2 d6 l3 f8 h4 s, B
# m( ?5 V/ Y0 E& S- `return null;  + q/ F' \; s% Y2 X! U
. u# ~1 B  A8 M/ @: d
}  9 o. M; F2 ~9 F& ^; K3 Z) f
6 f: M! `( g3 R3 B3 B
问: 在Java applet中如何显示另外一个HTML页面?  
1 }0 z% E8 H& t; N8 Y* |2 z; S. r9 D( c: b( Q. R# x. F5 n' T) P# p
答:  
* M! L$ x6 D2 e通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  
/ H! }, b+ m4 J/ k9 ^0 x4 f
+ d: p4 X7 |9 D4 y问:  1 Y0 v; Z0 x3 p9 N9 o- D. ]
用JDK实现的签名applet,可否在Netscape或IE中运行?  
3 c/ V; X! ~0 K4 |+ g; M& ^. S  _  a6 ~' W0 g
答:  
: |4 P1 a6 ]) ?$ C$ H# r0 K* O# y用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  * J: F% \/ C( m) F9 M* u
7 b/ |& x3 H% ]1 j' {
不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  
# Q1 v/ }0 D( _5 @* z- I$ V
( k; X) O8 U. m: q# z如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  - d, X1 ?" H, t. t7 j
! z/ |& f1 ~/ u  l/ B7 j3 L
问:  5 [. P, D1 `# K* l% `
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  
; |+ U( v, `+ y, }0 F1 L- x0 a) i; s, N: m6 r+ }
答:  
- u& B1 {4 ^  ?3 m如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):    l" s4 P  Z7 o# F  u: L
编写调用C库的Java文件,并编译.  
3 r8 b  q2 B' p* C$ t. X! v3 ijavac java文件名  
* r, h3 q1 v2 n- ]
( j+ k8 \- N+ [4 P+ ^% P1 g/ ^6 T5 w: R( E9 m) R$ w' ^
产生C程序头文件  0 ]" F: c2 B! p$ W. O4 D) G! k
javah -jni java文件名(不带后缀.java)  8 }1 F% ^1 E! \9 h  V6 L* J* `, }+ L, K
9 C7 d+ o- z7 r; [+ e! h
* k9 C6 X' Y6 a- x" m% ^# _. W
编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  , V" p4 o. J" o) p" ^7 `
cc -G -Iinclude路径名 C2.c -o libC2.so  : n! [9 N- m' F4 u+ ^% K
cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  & L. C8 L0 I( \9 E+ |

* C2 b' E0 ]% U9 |6 }1 x1 P  z9 n( {' y+ h0 J& {
设置环境变量  8 L: k' D% v3 J2 Z. }  `" F. I4 [
setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  
5 A# B1 W3 N! F6 M5 W3 w, f9 ]{LD_LIBRARY_PATH}  
- [6 i% V# f5 [& \! U* K
# A! e: D( z" ?5 X7 |- ?& C6 G( z) M+ o% B
: i: o! z9 m* \) P4 }8 W9 ?" ~运行java应用  
9 I, A" e/ X8 V: z2 T, h: X* i1 ~  M* Z8 e7 `1 O9 f
, r) |2 ?+ ]7 h0 Y* T
问:  
( D4 J" k1 R+ a& y# ]6 f在Java语言中,如何列出PC机文件系统中的所有驱动器名?  6 E) X2 G3 y% m1 `1 m
6 d! p) A$ j2 E
答:  " X- J3 c$ a4 D, {# U: c
在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  
5 E& i& o+ ?) W2 z
* o$ m5 m, F% `/ \5 D" i2 }7 r2 H0 X, z0 I问:  
" z2 Y2 E& v% R( n7 l+ Q为什么Runtime.exec("ls")没有任何输出?  5 \5 q; F" Z% w* g2 j
# L* n  ?& o: X2 L+ R0 {2 W/ n# h
答:  
, K4 u' F" v' K% {! C- E$ H调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:    e, ~% U- A: A" D6 S0 b

' Y! [) L, I9 s; z8 L! T% d
/ @4 ^( t3 F* g6 `try  ) i) o* \: C& h. y9 ?" ?  ^8 @

7 Z: L0 ]' R# m  |4 c5 A{  
/ o, j: Q/ D3 \2 Y* |  v( I2 d: x8 c( L& q
process = Runtime.getRuntime().exec (command);  
1 p9 E$ K) R/ p) B& y# o' \& @1 x$ ~) d/ R1 s0 |( j8 A3 E; o
InputStreamReader ir=newInputStreamReader(process.getInputStream());  
6 V! L* B  O1 X4 }! a$ O$ |9 }/ V" u1 q: k7 v
LineNumberReader input = new LineNumberReader (ir);  
$ C1 P/ t/ D* w% S+ x5 B  }" H9 \# g0 a% z4 n, @7 g
String line;  # ]. N3 ~# a- `5 l( m
5 q# L9 }2 d) Y, Y% c& N( n
while ((line = input.readLine ()) != null)  0 P0 N9 L- g, m/ f% a

/ h$ u$ N: I. C! |System.out.println(line);  2 O* e; x- k9 B9 J9 I6 n. A* v2 l2 o

9 v+ s" [1 W" C}  
+ E6 Q+ H1 w6 K  i1 g8 t: M
! w" g5 W7 W' Z* n# Vcatch (java.io.IOException e){  & z, s3 ~) f+ P- L/ q

) i& t( b. m" |7 M  r9 k. dSystem.err.println ("IOException " + e.getMessage());  ' f- n) |% P. p" v

% y4 Y+ r' n8 X8 V}  
5 W( b3 h, C: U6 s8 x- B
$ d1 R! z, s0 J3 E3 `$ r; ]7 p# u% @7 E: R; O4 B
问:  
3 Z" x+ f3 O  Q6 d如何产生签名applet,以使applet能够访问本地资源?  
3 g# J7 h! g4 }7 @  ]: Q7 a5 `/ K2 y# L6 J. B& U4 T% d  X" \
答:  
# c3 `4 @/ E4 V2 O, z' x在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  
5 I; J2 K5 P! r0 D
3 Y: S8 [6 d  P; f8 N* X) n5 q$ i7 I: [, W+ r
//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  . Q6 B  [" g& ~+ B. F1 ^

: W8 \8 @' U, s2 w7 Jkeytool -genkey -alias joe -keypass sign12 -keystore joestore  
+ }4 K+ F% ?. |6 {( z0 ~, d7 V4 Y" o
, c8 @- O; I7 x$ H# O) \, W7 G3 L//将SignedApplet.class及相关文件打包成jar文件  
4 ^; l1 S8 D3 b
: O6 {8 k! A( N! |7 i- `4 S: ujar cvf SignedAppletDemo.jar  9 d5 G0 s/ x( V3 ^3 W( {: ?
$ Q6 n7 D, J$ P. `9 j3 a4 k
//利用keytool生成的自签名的证书产生签名applet(jar文件)  
" F  X2 [  f% Y! b! u4 b; m: Z" o1 X6 d0 {; J
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  
* L( O. i% J- }- Y4 l* R6 u7 O% M* g5 n) K3 m' ^2 n' q4 N
//将自签名证书从keystore中输出到文件  $ k+ d  e+ |1 D- k# a4 p
* m# [8 |9 l5 u* p/ ?2 E, J, X
keytool -export -keystore joestore -alias joe -file joe.cer  
+ ]5 m& A- Q5 C! F
( m8 Q1 o+ S0 i3 R  m: S+ T% o
/ [( g. I# _) F3 z
" y: D6 i3 E' b* a' U8 n2 i6 C而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  
4 ]0 A( Z+ s; E; I, M8 i+ s
8 L0 \! E8 n+ |% v# q8 p3 IJoe编写的签名applet:  
2 b3 J8 v3 W9 g- g% |; C9 ^2 k1 ?
, L9 S: P) b* k7 q1 z//得到Joe的证书并将之读入到密钥库中susanstore中  4 N) o4 p: k: r1 X1 O4 o6 J$ U  u

/ ]$ e; E* V4 gkeytool -import -alias joe -file joe.cer -keystore susanstore  
9 F8 n! S% V' O$ ^* s8 J' ?3 Q- W( Q4 I
//运行policytool产生满足Susan要求的policy文件  : F) [# a$ t$ P0 [* Q% E6 `/ A
2 Z; {" U2 J2 }5 q$ z1 x# I  T
policytool  
% ?  V  |# V- F5 b* W2 u. _3 A' i2 x4 ]% O
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  ) ~, A' D! R% a) \0 a6 C
# L; S1 X- ]: d

& P. ?' n1 @( h+ C) U/ r! k
" t  {( V8 b/ t  F1 X7 E4 s关于签名applet在Java Plugin中的部署请参考以下网页:  ) t# d+ k$ q+ |0 k5 ]

( `+ G% }3 t& a8 c( |! hhttp://java.sun.com/security/signExample12/  ) T& s( u' O  {$ J5 X

7 {0 i% \5 ^* r0 E- @
9 L, }3 n8 A+ b& P- y: r' g, U7 t# R5 X  |$ r
注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  2 S( l! \. s3 e

8 c7 R5 ^6 I& I. \使用keytool -certreq向商业CA中心申请电子证书.  7 {5 {0 {* z- c8 d3 O5 |
3 Z. V/ O4 r( v# w- O
2 w# F! [% ?) k7 ~3 \: o! p
) z! q! g# a7 u  V* Z1 l

, x4 a5 b% Z( e; L( n问:  $ k) e& ~3 c2 r2 Q
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?    G. J( Q" P) e. B! X1 A

6 W3 f6 G3 A0 b% F+ H% k+ Z( q答:  
9 R; m) P' S" [' V( L+ ?/ x使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.    I: `9 x0 K& x8 h2 ]

9 r( d* U% z! B  f; Q, W' y7 c2 b; {问:  ) ?# S5 f0 A& A
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  & Z6 g$ m5 f# W$ u' I9 L* o

8 w. _. W$ V- J: x+ ~6 ?! O答:  
5 n: }/ g0 }1 ^; Z) ?目前,没有直接的方法可以将对象写入到随机存取文件中.  6 T5 x0 j! J% P! v
但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  
$ T7 q* r& H9 C; a# M1 d6 g7 J+ [
问:  
, F+ x! o6 G5 l# j' L' o6 G5 z+ I运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  
. h5 |8 k: G9 s7 o: C' G" c2 p- Z2 d" r+ W6 s  H+ R
答:  ' H' E! j' b! K* W3 ?
可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  * a( r4 X2 @: A$ z! b) Z8 d: }2 X  R
& e7 {4 o/ F. L2 G4 ]2 w& \
问:  % s  z; C' U7 u+ h- Y, b. q  m! e
使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  
' x  r- m8 q+ ^8 t( J) p+ l$ Y
# ^! {' q! A5 f' [3 D& M答:  . c6 |/ @* }+ `+ a) i
使用如下方法可以获得PrintJob的实例用于控制打印操作:  
; Z( z# c/ Y4 q8 Q
. b* l1 x  [. S* {+ X) ^7 _) m" X
( @( \! s$ Y! [) W! I& }- KToolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  2 x, Z' b, a6 E& t3 K" J' ]& _

* z; ]* ]4 \& X1 I那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  ! {4 K9 t. f, `# O! x: w7 L- q

) R! @& _& e9 y3 H+ k; Y. Cawt.print.destination: 可以是"printer"或"file"  
- o1 x) q7 R4 H) }3 z" U. V) i; I' n1 J% N6 n
awt.print.printer: 打印机名  / v6 W5 u- ?( l2 h

  p, H% j% ~$ ?3 Z, d2 i9 a3 mawt.print.fileName: 打印文件名  
+ \/ b; P" t0 F! S7 o7 u7 l  t" c0 k7 _' A4 p; @% X
awt.print.numCopies: 打印份数  
3 m0 T0 t+ t9 E7 }6 ^& j5 J5 b4 `! f$ a& m5 G$ z3 }7 s
awt.print.options: 打印命令的打印选项  - C# U5 y5 |, ~% |7 L: _, B9 A
- s3 L+ _0 W' h9 o
awt.print.orientation: 打印方向,可以是"portrait"或"landscape"  % z2 m6 d, o! _: ~8 u; A3 w* b

" w% x3 a3 \8 E7 a& g" nawt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  
9 @" |4 M" _4 n! J% x
: B0 y, @2 m# f% {/ }0 u6 Y) T9 L8 ^8 F
6 J0 t. D& o& q9 q$ a
* ]& a8 V9 i5 ^2 [  {  A* q0 o
" y8 R4 d8 m1 y( J: X5 m
3 ?$ K8 ?1 d7 o1 O
问:  
0 d0 u" Q( Y/ z* _9 g8 Q* g( B在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  : h. ^# @; y% T& Z8 `
& J% C. E$ s: y6 K8 h1 ~
答:  
& c8 n" p2 Y  k0 Q* uThread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  
- f. L& C+ M' R8 Q: j7 A
- t; T8 j9 |$ I  T7 I因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  
5 Q2 Z3 n5 I- S9 G" L3 j2 u, S, w* H! h
问:  
' h% w7 k$ H8 ?: k* G/ Q" ^使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  $ r) ?1 Y. E: x7 c; R4 Y! f

3 Q/ r( \8 J7 v6 Q* h4 s答:  
2 v6 C4 I: V& p在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  
0 P' R) [7 s* A7 W
  W% C5 ]2 W1 _* h/ Z6 C) Q( B0 K. i0 L0 I, B, C$ z7 c, N
ResultSet.first():将数据指针移到结果集的第一行  
& v1 N: ^- P; S( N
$ M) T0 N) C, @. h' T1 R9 TResultSet.last(): 将数据指针移到结果集的最后一行  * O& C: H% k8 u4 N' H$ U

& F7 V* q: e& F* nResultSet.previous(): 将数据指针上移一行  6 d+ M1 p) P) p0 Q4 }

$ T: K/ S( `- p& |- a1 u- f* c- S" H! p
以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  
9 Q% j5 o" M; z% r& O
  a; w: L6 V) @  p( N% Y$ S+ ?+ P0 }( w2 R% z
问:  
  C6 E% C. u% m% [0 T哪几种Web Server支持Servlet?如何使IIS支持Servlet?  9 A9 r9 a% G; s7 h% T1 T0 u

* _. J7 A, D) e1 R答:  
; X/ j) Y% L6 a目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  1 T! J+ e7 d6 U9 v5 N' M
$ `$ r& U1 O4 t8 n
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  
5 o" d! D( M% S5 f% _' A, C: |8 t3 t
问:  8 `0 J. Y) |% T, [% @5 q
如何在Java应用中将图像存储到图像文件中?  & q8 `5 X+ P/ s* @0 `

0 [" C9 k$ \! j3 P% K* ^答:  
; Q/ a$ h. C4 k' q' b4 F5 B, L) pJava Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  
: F8 y. u( I3 M5 W7 n; D: n: W) I0 K- z  Z
& o! i/ U1 b8 @" [; D8 _
OutputStream os = new FileOutputStream(fileToWriteTo);  
4 `  X* K' S+ L; H% U* p0 E8 P4 W" t9 N; X# e
BMPEncodeParam param = new BMPEncodeParam();  
- r$ w( g5 s' n% N9 j7 H0 ~2 k& U
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  
% Z  w5 g" S# v4 P$ r% h5 k) ]' p$ X3 d
enc.encode(img);  9 I' P( A$ _- g4 d  _
; x2 \, c) ~+ N4 Y4 I  D
os.close();  
' ~6 M) L9 u# E0 K1 m- c5 f" x; P3 m+ V
有关存储图像文件的编程指南请参考以下网页:  
  M  y* L  e. K0 g/ v) v# v
) V+ ~5 |& ]; m+ R' z* H, C" x2 V; bhttp://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  
/ u, {" u+ Q/ D/ O. j! G9 ]4 O- K) K% w
6 `1 L# l* p* I( W' t
/ D% W1 A) K, V! Z% e; _* A. W
# Q0 `$ D, m7 V3 T3 ^
问:  
/ O' X& l. c8 b如何用Java语言向串口读写数据? font>  
6 R6 ~. y( y  @' K) `$ N; h0 Z! Q+ Z; O; i* x* l; j* q
答:  
4 W* j& B" M0 kSun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  9 H9 X9 ~5 N  _! o5 d1 B" C  O

  ~3 s* O% a3 z3 S详细文档,请访问:<a href="http://java.sun.com/products/javacomm/" target="_blank" >http://java.sun.com/products/javacomm/</A>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
wangyu249        

1

主题

3

听众

54

积分

升级  51.58%

该用户从未签到

新人进步奖

回复

使用道具 举报

wl820609        

1

主题

3

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

deven1985 实名认证       

23

主题

3

听众

2433

积分

智慧的蓝色小毛驴

  • TA的每日心情
    开心
    2011-12-5 23:03
  • 签到天数: 106 天

    [LV.6]常住居民II

    自我介绍
    200 字节以内
    不支持自定义 Discuz! 代码

    新人进步奖

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-28 04:55 , Processed in 0.576406 second(s), 70 queries .

    回顶部