QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  + H4 E! h6 u  t% ?& ?# D  L0 G/ b

/ g. ~5 s; Q5 _2 h: U, j答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  4 m6 a" e2 d( s
Java 2环境变量的设置如下例所示:  
! X! v, R7 a* m2 gSolaris平台: setenv JAVA_HOME Java2的安装路径  & u" g  B+ T7 I9 d* D
setenv PATH $JAVA_HOME/bin{PATH}  , W$ W. y5 e( D4 `) x3 E: \: Z" S
Windows平台: set JAVA_HOME=Java2的安装路径  / ?2 E/ V' I* `# o  v  [
set PATH=$JAVA_HOMEbin;%PATH%  , ^' v& }5 J0 O& A5 J3 B5 z; F

- z+ G. R1 z% q3 n& X5 d问: 哪些Java集成开发工具支持Java 2?  
0 a2 i0 Y6 G& q3 f, g$ p
4 s0 [: I8 \5 A+ d+ m答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  
1 e9 ^% ^9 j- F; [, ^' d+ U( R0 D# ]7 F
问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  
. g+ v" l( ^9 C% \+ O* a8 d
9 s7 S5 m( q+ Y% V答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  : u* c2 Y+ L/ s/ X. }
    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  6 K+ ^# ~0 ], |/ H' f
    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  ) r  Z$ p& z5 S% [! a+ M% p

8 \4 ~! p+ r5 n! z- b+ e+ e/ i问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  7 ~5 t8 m+ _& ~+ u7 w4 W  Z

4 w3 F0 G( r* }3 M+ _  l' ~答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  
& Z! B% @1 X5 {0 y% B- C  x( D7 b' y2 a) B/ y! \$ e. |: V
当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  5 F# Z6 ?8 M6 ^

1 ~  x0 H( b5 Y' ]% N
& }" N" H- u% M1 t" d" FString native2Unicode(String s) {  0 c0 _- O2 |% a" m# e* o
5 A4 v* m* Z! F$ r) m
if (s == null || s.length() == 0) {  5 v2 O% }' U# D$ e. k
2 A# |% V5 H) l2 [3 o
return null;  % L* Y' L1 n( \2 M2 L. @
; S3 ^1 _* t( O6 X$ j# u# Y9 l
}  ' V& r# g9 i) q/ q8 A

0 ^& ]- h( n0 s1 d" d, Mbyte[] buffer = new byte[s.length()];  
; J, |: `! x' n* p  f: f5 @0 `0 g' u4 M* g5 c5 f
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  : K9 S9 Q0 B; r- Y
6 Q  x) p, N# [6 x$ W
c = s.charAt(i);  ) r/ ?1 k+ k! V6 l8 x& S4 F) Z
, {: s0 P) F# |  y% h% T
byte []buf = (""+c).getBytes();  $ L4 Q) L( E" U/ }& K2 S' z
4 T8 E8 T6 U8 x) {/ E; j1 ?1 x% E) ~
buffer[j++] = (char)buf[0];  
6 Y8 R% Z+ i/ ]1 i) i: T* L, w% u# a
buffer[j++] = (char)buf[1];  * ^5 U7 F6 n# Y! h8 y4 ^1 W+ h

! U6 g/ d$ b* R8 L% ^}  - v# J2 Z7 o1 i3 c; O

% _( x6 I5 i/ a! ^else {  
* z* _$ F, Z0 e4 X" g1 H' I/ L: H! F. R/ D
buffer[j++] = s.charAt(i);  
+ E* N0 }9 Z# I; ^
* k9 D( O. F! x" v- A}  ' k5 N5 H1 C0 r- }3 ?4 @# l
; t) [& @( O# V; n4 [1 ~
}  
8 B4 @( S' D3 k% J+ K3 e  B4 ^
7 I( b0 n0 n/ P$ `( A' Qreturn new String(buffer, 0, j);  
- r2 t) |1 i0 Q7 d6 Q  d- Z- A+ ]6 x" v5 B: C. ]6 R
}  
: J; m: H4 E  y7 S# E& F
, t6 Q. G" w5 `; e+ a2 h: p9 \- p除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  ; u0 z5 ~7 O* Q5 U1 ?; W

0 h3 o& x8 f, ]* k1 }$ c1 y- E
0 e( m3 T$ }: M- T' A问:  ! s2 l7 D2 a6 z. ]& n
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  
- H: ]' G% k5 I  k& ^" x2 K/ E% X3 f0 u- D1 B
答:  
+ s/ F/ U8 D9 S( ^3 yjavax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  1 ]; M) L5 j5 }1 W  S5 j

: L* x8 W# h1 Y
  o4 J0 X6 S0 w: t$ Z+ D# V  lpublic void doGet (HttpServletRequest req, HttpServletResponse res)  
- C0 K, g1 `- m: R7 J& m
8 ~* {% J" \# m# F7 Sthrows ServletException, IOException  / e2 h- m% a6 X! X9 p! w( n/ J

" Z0 P- S& J! [3 l: M2 n5 w{  % J+ w& W1 W% K+ H7 ]8 u

, d+ z" W8 x3 z& Eres.setContentType("text/html");  
3 u7 E+ P, l$ P3 p" R/ v: {, p% J  Q. z, i' R
ServletOutputStream out = res.getOutputStream();  
5 Z5 P4 [" E! C3 L' b% t
9 `# A. |/ N! m1 t. i& @" pOutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  . }  l' ?" `3 m
- m$ @% o( `+ \1 l7 U
ow.write("这是测试");  ' ?2 o4 b/ C: I$ Y0 ?+ [

, B# q! x! d1 }2 e2 Cow.flush();  
' N  I# J# D6 j7 s& b/ Q! w/ W5 u+ i7 F0 T
ow.close();  
& J5 ?" B4 Q; X) T: B2 Q4 k
9 v+ k+ b' @/ g/ E9 l; u$ \6 d}  + {, d, H, o0 M, ~
! W. s- B( \1 x  q+ u
1 P; O0 a7 o8 Q* b8 n
问:  - h9 \; ~7 ]+ W& C6 ?9 q1 q. W
如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  
0 F  p$ T: k7 n. w* G& s; u* M" ?7 o" I
/ G& G) F$ \9 b( x1 d+ C答:  
2 z- Q# G1 G# w8 z有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  : J, I6 D, N4 ?( J, k7 D; B
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  
" S$ P7 u) t+ z3 K  K5 V3 {修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  ' D. Y) `# _" M6 M# s, y* t
8 K' r5 B1 I. K% o, ^7 [' }

6 u0 e' U* e+ Z问:  : b) H1 u3 U6 Y1 e- t
为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  
% i5 Q2 K! a+ |
6 }5 L1 Y. h2 ]6 Z; E) r5 v) j3 G' a, ^答:  
9 Z. s  B  O) h& r8 z  g; p机器的网络设置不正确很可能会引起该问题的发生.  
9 r1 u: N. M2 u7 ]. qRMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  1 F& O6 b+ @5 i8 t6 ?* g  \1 H
. Q* V- s& [- K
如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  
3 k7 b! D7 |/ r# ?; U0 x
6 p# t/ f. v2 l2 O+ bIP地址 主机名  
! G/ n2 j" D( \( A2 Z6 b" x' j" C, E6 V$ u
如此设置应当可以明显地减少查询所花的时间.  5 o, j/ G. {% G5 C9 ^

6 S- J/ \8 {/ J( N$ _, z2 q& r$ T问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  
5 ^* H6 D- ]5 K$ B
0 ?* L- o" ^# L: L: {# v! b答:  2 x8 y# o5 N- A; F( N
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  
. p$ H/ l" [* t; h- p  m( |( v, K' {  R; F2 F' I) a

  H1 l$ ~) I1 X1 C) D1 Timport java.util.properties;  $ t3 V( U- s- z( _6 z

* l' b" D$ a1 B) n.....  / q* i" T7 u# u) f2 i
) B* }8 Z$ S- C: e
Properties sys = System.getProperties();  
; A, I- c+ N& j2 k" p
/ T: |( g! `+ o  {9 \6 t8 U& N# `0 Csys.put("proxySet","true");  * ~& {; g' }- s9 v2 D# J' h' b

0 ~3 d/ q+ g" d& N: Ssys.put("proxyHost","myHTTP.proxyserver.com");  
, }  z  ]/ Q, F/ \# ]6 e" s; y
) q# H4 [) L, k/ R  g0 |sys.put("proxyPort","80");  2 H, u& m& m. u. g1 H7 R

; r) L; @- r# r9 e, y, C8 LSystem.setProperties(sys);  , P6 }2 r9 W+ q
8 [' F, r: G/ w. `* t+ ~- g
0 Q8 S" p/ G/ M( K" d+ ~  g

4 I9 v* K( c# B2 ^8 V6 e& w$ ju = new URL(website);  ( j/ Z1 m0 u* G6 m
1 g+ d9 m# E/ h/ W. \0 b
connect = (HttpURLConnection)u.openConnection();  
5 z% D% ^4 N) `1 ], [8 K- J9 S, B, b
.....  / _) P- H/ X7 k8 n
5 S) `  G! A; {
问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  6 Q! q4 u( t- n9 g0 V

1 ?% f, S4 S/ X4 l- `! O& }答:  
& G" S& @+ |8 H, g6 J* y5 hJList组件有一个单独的显示模式ListModel来表示JList的显示数据.  
: ]4 m* F/ o% wJList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  
4 a8 O% G- m' A9 k3 ?& w- BJList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  
7 N- Z1 e# E& B& x% D当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  0 d$ I" W, D' b" B9 `6 j2 S

  N6 e& E* l9 t, `; S6 m问:  ! g2 D- }+ d# K8 ^+ @
在Java applet中如何实现一个模式对话框?  % ^0 }2 [  s+ _

( |4 e8 J& E) S: K! d, I( G! o答:  6 W* Z7 i5 e% _$ o' `
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  
# `3 w$ X/ x5 i/ T* f7 u5 A5 {/ t/ V# u1 B1 L* y! N/ C
3 \- f* U# C$ L* y
.....  
, Y3 t+ f/ j& P9 V
% a4 Y, A, i& @. A$ I8 O7 w; uDialog d = new Dialog( getParentWindow(comp),title);  
2 Y  J4 V( J0 s0 A8 @  }
+ \/ q# b3 ?8 T// comp为applet上的任意一个组件  ( {) T* O6 O! ~% B9 w
4 |) i+ W) ^# j( L- h- F( W5 {
....  
$ f* N; l4 w5 u7 Q8 z  i1 S7 l- N8 J" Z2 j% \1 m( n

% K& w" t8 J% L& N$ J* I, [9 t
" I6 Q' x  c' b/ K# W) u2 [4 Kpublic void getParentWindow(Component compOnApplet,String title){  
7 N$ t5 K! m' Q$ Q( a6 x
2 v& c  S, e. v+ qContainer c = compOnApplet.getParent();  
0 D7 f6 _. C# \9 H! `+ q
$ m; Q: Q$ @. K* f# U8 rwhile (c != null) {  
* X" O( k' T% M7 _3 ^9 }( X2 k, P! G& l  X# U# Q& R
if (c instanceof Frame)  
9 |0 T* v1 s: v. z$ X6 q( I( v# {( E, U1 \9 Y
return (Frame) c;  
8 U/ J( X* {, G5 U
( c5 z- G8 Q: v8 _. `( j+ R( T3 Pc = c.getParent();  
* G) P5 A8 `/ X9 \4 Y1 h  O* j, ~( |# V* E" K/ c3 h' z- {, ^
}  # g/ |& e" ~# T; W3 A% ?7 r+ S
, S* V# Z/ d4 l7 k0 \9 F& m: ]" k
return null;  % m0 {& K: Y+ e# h( f# J

+ K3 `) w, N; ^( s7 O0 n# |}  
0 n- `0 A2 u' p- s1 C
3 y& a4 y$ Q# F- W! d问: 在Java applet中如何显示另外一个HTML页面?  0 D% V" z9 F# Z( k; {
* F! a$ E1 r# a
答:  9 v! @0 e9 }1 q% k  h( O
通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  3 o% A9 M; h% z# A# E. U  ~. x
2 h4 [. @, X% F1 m& Y
问:  
. G4 L- T; L, L7 c6 P& P9 n% W用JDK实现的签名applet,可否在Netscape或IE中运行?  
/ E) r, l% b5 A" g" }
& I& {8 A9 B0 e. D8 Q& u答:  # y) T2 E+ `7 w. K' H9 I
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  
, r/ z$ o+ h0 ?3 [2 ]2 u* Y' n9 W6 x0 b% R8 U3 F5 j0 x
不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  
* s" D" G3 R+ T1 @. H, s' I& c  b' G7 a+ P& j( z6 m
如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  
% z, _. ~4 }' K9 }+ z+ J4 M
# J6 ~% ?" o- s问:  - k5 G2 Y. m+ `4 b& u% P
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  " U, L& f; @1 v: ~7 |1 E$ S
2 d9 Z! a) g8 E4 w+ n/ v! O
答:  - q2 p; a3 f$ Z& @
如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  
/ K% ^9 ?5 A/ ~9 D编写调用C库的Java文件,并编译.  
  Z; m+ n& Q, P8 R* W9 sjavac java文件名  , x3 W* D  ~2 I* o9 L. o4 _
6 L4 _3 R) l: }1 S$ n9 ?: x! z

- w1 T: |: H1 T# s% ]1 z, x产生C程序头文件  
2 }: y* N" y9 t7 {* r5 ]javah -jni java文件名(不带后缀.java)  
7 X4 I% M1 I8 s5 R
+ \0 C& g4 p1 K( K0 Y0 i, F# _5 O2 c$ _+ f
编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  1 a. ?. [& @3 q/ R) S) R" A% F
cc -G -Iinclude路径名 C2.c -o libC2.so  
9 r5 J" \: v! J( G: X; c) {cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  
; n! i/ I' y' q% o$ t* w
! \7 W9 T7 I' K* q* N8 I0 W3 T9 e4 M3 U, F8 I
设置环境变量  
9 m  G" @' U$ M% qsetenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  
- S) r: I0 o' J- b0 B, S{LD_LIBRARY_PATH}  
6 T# A6 g# W# i$ X6 z5 I& x; L
# e3 L4 I2 @* r7 X8 [
0 R- c* P7 H8 ?/ L: X5 |, k% A运行java应用  
0 M& u2 X$ h7 U( u7 H1 G$ j. J3 \5 j3 I% @

. D+ s7 R+ O9 Y4 X问:  ( |& N6 B+ F! y1 J( }/ R
在Java语言中,如何列出PC机文件系统中的所有驱动器名?  . u; l3 P% ?1 ~

% A: A' U: q$ o# \5 F8 H: b# L答:  
( q( M0 @6 m( t  K2 |在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  1 z' P+ }2 C1 y$ C' A! y
& I/ L4 m0 K5 x; q
问:  
5 q3 ^; p5 Q, c% v8 ?7 b- P为什么Runtime.exec("ls")没有任何输出?  
' E$ A$ e  v% ?
  s3 y, k) P/ l+ v9 F3 a答:  , k* E1 t( o2 j+ E( \
调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  
" |. w: @4 j: ]% P# n% |# x' s
4 f( l- i: V5 W( l& d) J9 K
: T: b2 r0 A  B$ v3 V1 @3 z! Qtry  : ?- \7 |2 M3 V

- M% e6 Z3 w4 @2 }3 l{  5 N" L, V5 T# Z
/ U, S9 I& e+ ~4 p3 a; Y
process = Runtime.getRuntime().exec (command);  
" Z# h* A" I( ~! O+ q% m* X% m6 H* J
InputStreamReader ir=newInputStreamReader(process.getInputStream());  
. i$ O5 U" S' w" t# Q/ q# U& W2 v& ^9 e' y
LineNumberReader input = new LineNumberReader (ir);  # r* N7 M7 h! |3 I

! O; W8 m( p; A" r% I0 }8 P! jString line;  
  t2 u' F8 d, o6 n# v
6 }, N- i# v7 rwhile ((line = input.readLine ()) != null)  ) }( |* B* a3 _* d3 k

+ i2 x7 e2 g* v, p0 DSystem.out.println(line);  
+ p0 P" A! U! n( ^$ c/ J7 h( ?* a0 K
}  & y6 |# R% ]9 {" L

% v6 l* V' z; N! @9 E% r/ j+ _catch (java.io.IOException e){  
6 ]. Q7 x1 O0 f( \) {/ R) |9 p
! Y) t9 @, E$ L1 G9 TSystem.err.println ("IOException " + e.getMessage());  
% E, `2 f: s5 g8 P0 J
0 H1 D6 r3 H. Q& r- C! ^5 M}  
4 ~9 v) |$ E7 Q9 T* ]5 @
: J  A) I+ R+ a" h$ x) D( g& W* S/ o6 C3 e" J, r- j, ]( V4 W, R
问:  1 V# m8 @3 [1 x2 Q+ k
如何产生签名applet,以使applet能够访问本地资源?  
% s- f, a4 Q* c9 m+ ?: m4 Z4 l' D
答:  9 {1 `' o7 f: e
在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  . }6 z  D+ e5 A: f% \9 x

. u- v6 Z7 c* m* Q# X; D; Q4 a5 R. [4 [6 z" o
//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  ! o+ b4 `" w2 E; k+ h7 B. c2 P

- G% w$ `# Q# |, T( o2 Rkeytool -genkey -alias joe -keypass sign12 -keystore joestore  % E! `, J/ {* Z+ V* t: ^

, a* Q  W5 G! P0 W% L4 V: R* U* ?//将SignedApplet.class及相关文件打包成jar文件  
7 S: Q3 T. q4 I0 O! o8 V( F
5 [. Q# T2 ]' d6 n: l. ojar cvf SignedAppletDemo.jar  8 c0 G/ O; w5 X# R+ R, O2 t- V# V1 n

2 u" L) C( O( \3 N+ y//利用keytool生成的自签名的证书产生签名applet(jar文件)  7 B& {3 l7 B7 u/ k6 D
2 L+ ~4 J3 z- c# m7 Z6 d+ s
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  / L4 A# \  I" P
/ }3 v( |+ y  X' J0 Y  A  t: R
//将自签名证书从keystore中输出到文件  
3 t/ {- I6 a# ]# ?/ L6 E1 I- S. c; f3 q' ^
keytool -export -keystore joestore -alias joe -file joe.cer  
2 {2 k3 o6 |, @7 D' k1 S& D  B! u+ c) ]. b5 h. a2 D9 @) N
: _, K0 Z1 X1 a! o

2 s+ D3 K5 T9 b( {  ?* _2 N而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  
; C8 m% v+ o  ]; _& c( C' x4 b4 u; J: L7 }$ V$ ?
Joe编写的签名applet:  ( p& U; z, l6 H" D6 m8 K

. A; H, G* ^- H9 R' }$ T//得到Joe的证书并将之读入到密钥库中susanstore中  6 P! Q7 \' W0 U+ c$ u; p
8 z; i' o3 J3 y  C! J. n7 g
keytool -import -alias joe -file joe.cer -keystore susanstore  
3 k# }( I, v2 e$ ~  U# _+ K
& {% p0 u- ]- p- w, P//运行policytool产生满足Susan要求的policy文件  
6 i6 E. v' D6 j1 F! p6 ^9 G  `) I& M( S7 p' p0 w! A
policytool  0 k- ]  b, Q. H! F
7 w, Z. j* m3 F" i, }8 j6 v
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  7 @9 j7 k: ]: d3 q6 Q/ I

( u# ?; @* {# Y8 N; x2 J+ o" U# K3 P2 p. i( s5 r. U

# j5 u& \; b9 q- @' |& H+ p2 ]' j% x关于签名applet在Java Plugin中的部署请参考以下网页:  0 w' D2 O& I" W  N* _6 C
) |/ _6 H1 M& I, a( g3 o# N
http://java.sun.com/security/signExample12/  0 y5 ~1 L1 o1 Z+ q/ n

- F! z5 X  Q) y" \4 X1 y! w9 q

+ D5 R$ _  ^& r3 \  \4 J注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  
6 G2 c+ y- L/ ?
. I- a& }. g5 O/ W9 Z  Q: s3 N( ^使用keytool -certreq向商业CA中心申请电子证书.  
3 u- e! x2 v- g0 H: V
7 R4 R4 l2 M' N
& I# e; i9 B( r2 D9 Z6 n1 B; y; G5 V6 F
. i) |# i3 L0 H( a* i, ?& X
问:  
% D7 z3 O$ k: }6 v+ S% ?& O若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  
- ~$ t9 U2 E  n; @. j0 L' L# [5 N% N  ^, G2 K1 `3 N8 }
答:  ( d! J' t/ M  l5 |
使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  
' @; _3 c) O7 b- N9 \: b1 I$ z, ^: Z$ y; c2 m
问:  
# z) T: P2 T- K" T对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?    v" a, R! ?3 h# `

, a* _, f- Y; L8 s. w) W答:  ) x: }, K9 D2 l$ O3 Z4 e
目前,没有直接的方法可以将对象写入到随机存取文件中.    L7 ?) d4 P" e+ P
但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  
& r5 H6 Y3 c2 j" Y& G* [1 z  R
; C4 L$ d. x' [& O$ k: t4 e问:  
  n( _# o5 t8 ?. i运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  * [  y! ~( d9 o4 {$ E
2 x* s) K; {- [# {* m* ?
答:  
5 K* J" U5 M+ Z2 m% M8 A可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  
( `1 C8 n0 h$ t0 `; l/ Y1 ]6 O8 ~, g* F# i# o+ o
问:  
' z/ H' Z2 b1 k使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  9 D" O3 n% J0 c/ ]. b
% _, m* i/ B5 P6 ~4 A; n1 v3 C
答:  
/ b6 H0 @  g( w1 c# }使用如下方法可以获得PrintJob的实例用于控制打印操作:  $ o4 R% ]5 i% F, n" }; l
" c/ ?. s! h, q# Z' Y

/ s* ?* y+ j! |* D& }! QToolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  9 u, v( g" y6 k3 A" W
! {7 B5 ~; V5 V! j. k$ ]: l, ~6 F
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  
) b6 U5 l9 D8 a& H' f, }$ q! x- N! H& r' H6 J" y' t
awt.print.destination: 可以是"printer"或"file"  
# V4 x; _+ B" R! x# e0 o( O+ c1 @1 n+ d2 y5 u6 w+ E
awt.print.printer: 打印机名  
* {$ t9 k( p6 u. s8 o0 Y
' ]2 s' D1 q6 p3 W3 `awt.print.fileName: 打印文件名  7 C3 T( L1 a# A+ ~

7 E! j- C: f( Q: V2 qawt.print.numCopies: 打印份数  ; S, A5 i; |/ y2 y

& |2 J4 K" e6 G+ C4 Iawt.print.options: 打印命令的打印选项  + L. x% f8 o' h: G& h  R  t
8 o0 r1 B; g" d7 b) P) Y& D& c
awt.print.orientation: 打印方向,可以是"portrait"或"landscape"  
- k. I" ]# ^8 l2 s3 q) y7 z# J3 ~
" f/ `5 a1 O$ g' ?& ]9 dawt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  6 I- k$ v. t4 A  z1 W/ Y1 @) E
$ s( X1 g4 ~& T" O' c
, f: z" H$ a. d
  s# I% ]1 @' p( p, ]' q
: ]( |" u  r+ c4 F5 Z" H

4 k/ b* o8 I+ j2 o# Z" [8 M2 M
" o4 ?8 p+ }3 @9 U$ O" _# B问:  
- v  i" G% R0 o: j' d1 D. M在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  8 [6 w3 y3 V1 ~* k; I

' R& |# I3 y! m* a+ \. e' L答:  
" K+ L: Z* [0 o% U* c3 qThread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  
6 \4 H8 }) X3 {1 s
8 n$ D6 h. y. J! I4 h! u$ F$ M- c4 ^因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  1 [7 a& j7 ^: f: h/ y$ Y$ Q
+ g$ `3 m3 d5 K' b
问:  - V% R* y# W9 {$ H
使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  ) ~* \3 v+ K. q9 a2 F# F2 c* l" V2 g
* H* }* r. u% H
答:  ' s( B2 Y, l5 e3 M) I* }( p! O. N8 r. ^
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  
9 r' C+ j8 s- a* {0 n- m& S/ b' q, N
' w7 G- E  q. m- t
ResultSet.first():将数据指针移到结果集的第一行  
5 i5 ^& `& @' m& G# e
+ U- g; R. S7 ^3 g9 ^0 ZResultSet.last(): 将数据指针移到结果集的最后一行  + \' C$ l$ W3 G$ a
0 g) g8 }, e3 e) E, y* ?! S4 f
ResultSet.previous(): 将数据指针上移一行  & W: C9 [$ A  A3 d0 i9 T
- A; S2 J1 k8 O4 |2 J3 z
! `8 {5 R2 k( |& S7 b1 x. U
以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  
' y1 g1 u& v4 A, S% \* a; T" S- H% v9 k) _
! C/ e+ z" O( H" J% b$ G
问:  1 ^* F0 ~: v$ [* l0 f7 G
哪几种Web Server支持Servlet?如何使IIS支持Servlet?  
% @$ |) i+ _; a" y
/ `1 c- R& Y# S) L# H4 i答:  
% F& g! X* H5 O, \, N目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  " Z( O8 d, V5 ~4 m
3 _) L8 G5 O2 z# M3 ~
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  
* v  `- b: p& S  @0 \
1 ^1 Y; n7 g8 N/ E( ]9 p问:  % `  S4 V9 h7 p" [. Z; T
如何在Java应用中将图像存储到图像文件中?  0 r" V6 |; }  @! H8 y

* {% [. ~7 @2 k+ C4 w答:  * y5 I9 X5 q3 M4 w1 r3 U* `4 Z
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  
3 ?4 }0 k& z2 ?3 B5 J* h/ P( `$ v& T* a) E4 I1 j! u, U7 Z- V  c
1 Y. K" y: _$ `; Z4 g' M) ~
OutputStream os = new FileOutputStream(fileToWriteTo);  
. ?$ z/ r& a  v; f! p2 G# x/ P5 Z6 t( L( `& m1 n7 k" O& M! U; g
BMPEncodeParam param = new BMPEncodeParam();  
! o) L3 m0 P9 G0 z1 h% ?, o' Q3 ?' q5 y6 L, l. w/ y4 y2 u4 K  H- Q
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  . w* T* y/ J# G) _' |- N- k) q+ m

  a7 _( h2 g9 q2 Q- Y. venc.encode(img);  # r. |; O. a  V% ?3 y/ U! n  l' a

/ R, @3 X, E3 ^" d# `- l! w3 {/ aos.close();  
$ R! E' M" ^8 P1 T- C' V5 b1 C9 Q2 \' W
有关存储图像文件的编程指南请参考以下网页:  8 |& u4 {7 Q( G$ _/ T5 i

( m* K$ [" g1 {' ehttp://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  
( P5 S2 a. [. t3 I6 y/ N
6 V! i- A; c6 {) o3 M
: N- [! N. t) e# d4 H2 U5 G3 o( U& C5 q! h- a0 X/ W$ V
) Q2 b5 C5 j( q; Z3 P
问:  ' ?, V: O  D5 {1 d5 B
如何用Java语言向串口读写数据? font>  ; l/ l" z- e1 y# a
+ k$ f1 ?( F5 I) M2 P1 z
答:  
+ w( x& x' ~  qSun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  
; |; e2 G2 f- N" e: n( B/ t, `+ n7 Y- Z$ b9 T* I3 B
详细文档,请访问:<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, 2025-7-29 09:44 , Processed in 0.657659 second(s), 69 queries .

    回顶部