QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  
7 a$ Q+ w, w- c7 X3 K* n) l6 ~' M/ o4 S, v# o0 s' z- Y
答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  7 l& h0 o( ]- u; j
Java 2环境变量的设置如下例所示:  
: q) I1 l7 y& c( F, D! PSolaris平台: setenv JAVA_HOME Java2的安装路径  
7 K# t/ p) ~/ s, Asetenv PATH $JAVA_HOME/bin{PATH}  
6 ?- I2 _8 v+ R5 PWindows平台: set JAVA_HOME=Java2的安装路径  
$ k% n; p6 Z+ V" b/ sset PATH=$JAVA_HOMEbin;%PATH%  1 B  N2 ^1 F) E1 C
4 F( J8 u% Z) O
问: 哪些Java集成开发工具支持Java 2?  + b7 P/ `3 @& I6 W$ A

: \5 w( x6 L! r: Q答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  
+ u1 V) f( e, L& k7 ]$ I" U* J7 Q1 s% v- h* U* }
问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  * z! a( y8 k, r1 V- w

' B8 l1 y: \/ U2 w答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.    {7 c. U8 @6 W3 [
    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  
6 r' I% f) I' y    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  
/ j  E% J" R3 S& ^; s  O
# ]4 L) c9 G" Q% s& [问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  & ]. v0 E& q+ J! |+ A
# e9 V0 }! t8 Y0 W; ~1 n3 m: O
答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  5 g& I6 a. h* f, u2 D. s

4 O! I7 m5 z* G  V  _9 [当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  ' H: z2 j0 P) {. Y. {
( u6 [  I& L# x1 Z: U
9 ]) l& ]' A3 t$ Y# j  Y/ N
String native2Unicode(String s) {  + s( ~' w% W: i
8 d+ u# G; K! j2 l/ C6 @
if (s == null || s.length() == 0) {  
* U. e; G# U1 H: y' O. j+ m0 F& X3 q( ]( H( v7 ^2 a5 E
return null;  : n. E5 ]3 d! t% ?8 ~2 T! K

* h$ V5 o7 y; T# E}  
8 D% K$ Z( \: j) H' V. R% m$ \4 M; J- N
byte[] buffer = new byte[s.length()];  
/ C3 P7 N/ n. {3 y% ?/ Z( _+ {+ k7 S9 {- p6 F7 y1 l
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  
7 O+ L: J( J4 G( G0 ?
. [- x% E0 R1 u- m, k! ac = s.charAt(i);  
, \( `1 f' q  O+ |+ D  ^) N0 q# ^0 N8 d/ i6 y' K) l
byte []buf = (""+c).getBytes();    w8 s4 U) A  I/ ?, }7 S
% f8 e5 ~: G' m$ s
buffer[j++] = (char)buf[0];  
! G) [9 Q. [4 j1 W
" Q: R6 g$ R8 }1 R+ ibuffer[j++] = (char)buf[1];  $ _* w; P3 X+ C

0 s' E- u* {( _$ }. w4 o}  
: @# V5 n& k8 `2 s
: U% t  `6 C2 V7 q9 }# ?else {  
- b4 E3 [9 J7 J1 y3 _; i: l
; W  O1 X$ r5 \# g! j8 o: gbuffer[j++] = s.charAt(i);  
0 u) a4 m4 N5 m9 @4 l
( M8 J, |/ q) d9 P+ J: f% v}  
+ |' |/ ~: k! r! [
8 n7 L$ q/ c" W$ _0 n}  1 X* O! _% \* F1 |- X$ E
- e4 O; Z1 A5 i% P, l' [; T
return new String(buffer, 0, j);  
' `' w1 t8 C7 j" H& T* ?# ^5 ~5 Q" G: y6 K8 T- c% q( x4 P
}  6 D  f  F. Y' F# \/ @$ [
; ~. J6 U6 U/ E3 [+ l( s$ n
除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  / R! ^( ?& e9 I) @' _8 L

! k" H" ^# u$ [7 R( \* C
4 W5 P% m: S) Y0 |问:  2 o6 ^5 _1 W& b% O
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  5 m: m3 U9 k7 E
+ l$ T# _7 q$ p0 Z- h
答:  ( P% I. g2 m- |5 _  K
javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  7 m% C" l' f, z
& }7 q  z  j7 ^' z0 n- g( r
! W1 G4 J; [5 V
public void doGet (HttpServletRequest req, HttpServletResponse res)  
2 r4 }7 H1 d" _0 T. U; Y9 B+ _6 P5 v) s) O. T0 u! q% E
throws ServletException, IOException  " |8 @: b5 \/ f' V2 ^7 Y9 x
0 B7 r% q9 v0 D3 w9 F3 _; l" D
{  
" p, F8 `  Y$ Y6 {2 N- Y1 F. y; d/ `$ X9 W- i% V( n
res.setContentType("text/html");  . g- E  J1 l$ Q9 f

% W) ~. a0 O' N/ ]2 AServletOutputStream out = res.getOutputStream();  
4 f9 Q5 c1 l1 Y! _4 e5 z- u6 M9 A/ V2 q. g. `
OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  $ \) ], v# A. {: \& s2 S& |
" Z8 m& O/ ?/ ^4 D3 Y% x
ow.write("这是测试");  $ X9 D0 y) Q* B, l7 x

" V9 }  R  I- v1 x) qow.flush();  
) y5 N( a" X& ^! O4 x6 U6 [7 n1 P  l8 J  M9 Q1 q0 Q9 E6 A% D9 q
ow.close();  " z( I) d! G( M) y

2 c% |% @: v) c}  ; G3 x' y; g: F5 u3 N( l4 I

  R& B$ S  y& L1 D' @* A' e
/ _- u* R# R6 i: M6 o问:  # D# t0 q, i7 t  x1 B
如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  
; j9 T9 e7 [! W& z4 i
1 H; c3 L' d* P- N- q. R答:  ! _1 g0 H% K1 M9 `. w5 Z) ^
有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  ! L# @0 v! Y  ]( F( z' H
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  
: A  }7 _3 G5 L; a+ p修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  
. W. A# s2 v, W: H( Z' N: E: |' {/ y/ x9 @: L+ W2 j& H: |% d

% f. T$ H7 |8 b5 n问:  
- v% ?; K6 I: i0 r. k& x; o为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  
+ ]/ a" v" s' h8 z# P
6 x" h& a% x: o  F: @* |+ t; u答:  / i8 v: e4 z& F2 E4 e, P  @
机器的网络设置不正确很可能会引起该问题的发生.  
4 f3 L( C  B5 z( A9 r$ fRMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  9 X' O' H2 C) \/ P3 D. j3 }
+ W0 D+ F2 B% R& K1 a! W4 t. x% x
如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  # i' a' \3 Z5 }" V) x! C/ G
0 F. [4 m. i* M/ c
IP地址 主机名  " x; O- |, v+ J8 W) W9 a
: I7 f5 V2 i8 h/ ]3 b1 y, w
如此设置应当可以明显地减少查询所花的时间.  * x! n) G' k) X' q% h1 R

3 K) d# k/ w& h/ q3 p1 u问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  
8 w7 I( X/ ~  {& ~3 m  I/ m9 b% t' d% r7 K
答:  
9 Q: T" }: Z" I' O" i. N4 e若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  5 J# H, x. b! Q# r+ G: i- {- E

8 _' V$ |/ T, b
0 w* }! k; }/ ~8 @3 kimport java.util.properties;  ; G9 Y/ `/ }/ c, R, @- P* l

4 ]  G3 y% j% ^1 H.....  
0 n& \" G' C; p" h2 [1 i* }) c; q' [$ C" ]3 \* w
Properties sys = System.getProperties();  
0 |5 I! H# }! @  f) z* v
  f! `% M2 v0 n3 D2 Wsys.put("proxySet","true");  
, a. t" s( k) S1 C# \
( ~% z3 F5 l+ ?% ]+ z' csys.put("proxyHost","myHTTP.proxyserver.com");  - Q. C% x8 L- b, W: c) Z' ~- J

: r* }  q" F1 R' t& gsys.put("proxyPort","80");  ; Q% r( O8 v, y0 z' N! g
  M9 _/ F" c; _6 a6 L* a
System.setProperties(sys);  
9 C+ e8 y, ]) H: Z% L+ }* B
5 i- a. g% U( V- d9 s7 n% }
: z/ ]3 A( P5 O1 O8 c! I4 p% F( k* N; T6 ^0 o" k$ @
u = new URL(website);  
# ~+ y) y9 \5 ?
( a  I$ z) C8 O0 `" `5 {connect = (HttpURLConnection)u.openConnection();  6 z3 M1 ?2 x7 u/ {# ?( Z# I
. N9 e# }3 ?9 y$ G# g' F9 M
.....  ; \$ j1 I( _3 K, j
0 a, i6 h; ?* p) a. R- u4 Y: j7 o
问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  2 Y( S3 q" ]% N2 P3 H
& V5 s& G& M; |3 W% h
答:  
# V4 [0 v& T, r; N4 W1 c/ gJList组件有一个单独的显示模式ListModel来表示JList的显示数据.  % q7 J" `& |& y. f% g7 j
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  3 e( G. R+ v4 q
JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  
: H% T8 d1 n) K! \当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  ' ~- ]) X, F( o- {) B9 {" x

5 J8 j! r( L8 c. N' U% t9 j问:  
" m; D! _  i/ C( v) r* j在Java applet中如何实现一个模式对话框?  
' z7 u2 r) \" t  t- C3 }! ]- `. V5 y9 J: _3 Z
答:  
0 o; E; `- d- b" i" E- }在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  
8 m; M/ ~: ], f; d) f* a
! a; i0 n* ~# B
- `. z( r% c. [' \9 Q) h" s6 p, b.....  
% J6 c" n2 d, [+ L' H
9 i2 I9 X) M& u4 g- B: BDialog d = new Dialog( getParentWindow(comp),title);  
+ ]+ ]! r  b2 T3 E9 h
8 @1 F4 X9 L* N# D5 q* s// comp为applet上的任意一个组件  4 [0 A, {+ Q3 q, x

4 S! U: w$ A# j/ k( z....  
* V( N7 n9 C5 p- O# b8 W: @6 E
! ]+ R% c5 w3 b' R) B
9 @; |7 G. T) X7 c4 j% t9 X3 `% `+ M3 O' G
public void getParentWindow(Component compOnApplet,String title){  ' l, A) m$ {, [1 I8 A
6 A& c% t$ f8 {* R
Container c = compOnApplet.getParent();  
, m9 }2 t. Q7 o. \/ W8 n3 l3 z: l
1 l% U2 n6 F2 A& \/ T. xwhile (c != null) {  
/ U# U5 L' F0 K% Q  c3 f8 g$ ^
% n6 C% c6 ~8 {1 A5 {+ |if (c instanceof Frame)  ' {/ {5 E; P7 _( v8 O
, X, G$ X& C$ W% |, a! M; r
return (Frame) c;  
8 O& U$ i) O1 n1 G+ \7 H4 E/ ^/ I+ j  ]4 c6 u5 ^
c = c.getParent();  0 v9 @; p8 R. o. Q" \( S- l

" Q, y8 b& d2 X}  / X( [; g$ N# r5 b

4 o0 j* [+ ]( @# W( A# Treturn null;  
1 a6 B, v! r( j/ d4 v" ~2 x, I9 |
+ X! `. c* j) f' s, a}  % c8 y& a3 x6 b( f  h7 g

& A3 I& S$ P7 d问: 在Java applet中如何显示另外一个HTML页面?  % b' d& t0 o( a

9 L9 q+ T; |- n5 U% d6 _答:  
" {. k: S/ h: |/ N通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  
& {. O8 U5 {5 l  V- D7 C$ I5 Y% _& j% o# ^0 h2 D& e6 ~8 f
问:  # F# s1 t9 o: N/ H, a
用JDK实现的签名applet,可否在Netscape或IE中运行?  
; a6 _9 c: R) }% I- R; A. H0 R; i) _9 B
* v/ K+ E# Y3 W; Q& @% v答:  ) P2 @/ r% s6 n& H& s4 a
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  
) ]- j; H$ r; q
8 y5 r' |, O$ Z) H( R不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  
: D, f- k. C3 I6 I: V1 G/ _+ K: s4 a3 f" \3 `1 i1 i1 ^! b
如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  
) ], N4 B% C; {, k
+ B/ S" F4 b% l' U. |问:  ! \' ]( R" d' N' s/ x
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  
  M; t' `5 x. a* g2 V8 f6 ~: U2 K
- i4 W7 t  n; ~9 ^( {, ~! |6 n/ p% _6 R答:  # I4 o& m( D) _
如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  
0 [  E- q$ p* I8 C1 `3 o  R2 Q# k编写调用C库的Java文件,并编译.  5 \' Y6 L  g2 m1 |8 B, G* o
javac java文件名  4 [* t3 D9 K/ a+ ?& ^5 K' _/ e
0 ^2 v. J7 j+ {' F  m

" `7 R- ]! I7 b; F- r' ?产生C程序头文件    x$ G  `( j+ I4 q" X; ^- Y
javah -jni java文件名(不带后缀.java)  
8 a  ]$ u2 o$ J4 g9 `! a! p# U" x2 R& |& D9 z

. F8 p3 d4 _& m$ i: L7 d编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  + U2 c1 I9 E. X6 O& X! ]
cc -G -Iinclude路径名 C2.c -o libC2.so  8 G1 v, F# g  ?* s* k2 p! Z; G
cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  . M* L8 v  k/ n' v9 S+ u! w0 \
& ?4 y% v0 d+ n" C. q  K4 n7 D
7 D4 G* k7 Y- A+ l
设置环境变量  ! |4 U' [1 K2 Z: ?: x- ?
setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  8 E6 P, a- U1 Z- O" b/ t0 k0 W" }
{LD_LIBRARY_PATH}  
" M1 k; n# \$ E
, d) W  e! D7 B0 i6 P; ?6 _% R+ n5 L7 n7 _6 n) u- [$ R
运行java应用  & Z; e6 k3 h$ B- M

7 G$ h5 O9 i$ }( i% w# v1 T* f# n' i
* a! S* O0 y9 R& }8 p% `# d问:  
7 \  {9 O% O) `4 Y. y9 }  O在Java语言中,如何列出PC机文件系统中的所有驱动器名?  
, M+ M0 @3 D9 \  h4 I5 A5 k5 ~/ R( q  v5 N2 z; @9 G
答:  9 H4 a. f' q, S' K, N/ c$ u( B6 k
在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  
2 a* q/ g0 x* H& |) k$ E9 r& U$ S, o# h. ]
问:  
# C& n: l; j4 W; ^0 }为什么Runtime.exec("ls")没有任何输出?  5 A4 z* Z( C7 M( f- ?" F

1 P" K" C4 e+ H" }1 p1 I答:  
$ S* I& V: \* D, X调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  
; k; Q0 n! n5 V2 t( b4 {9 X" N0 m) T4 B4 `* |- q* p
5 }7 e. m3 @! z5 V% C  l
try  
2 h6 y! I' M- Z/ U
2 `; {, @7 S% _! o6 z{  7 c- e  C$ J- C

% B0 v% I/ ?  u7 F4 r6 c& _1 Nprocess = Runtime.getRuntime().exec (command);  1 O5 I' k5 M: t4 a1 L, g9 M1 W
$ p5 z( A* ^: f, e7 z9 S
InputStreamReader ir=newInputStreamReader(process.getInputStream());  
& T7 [& O6 c9 {9 C8 F
4 b3 p' `5 r& a; A% ]7 XLineNumberReader input = new LineNumberReader (ir);  
$ s( W, ^) n# i3 L7 J, d
$ z5 K; p! X% M! p8 Z+ S6 e- y0 G6 tString line;  
( @" s! t- o3 a: e, t- }6 J' _( c2 Q% x) U# w* \. U+ k
while ((line = input.readLine ()) != null)  
' m' {4 _/ j: A( Q# m: d4 Y& e
% `4 I6 {. ^; n4 Q# \System.out.println(line);  
# V' i5 `+ T! l, `
, i' M9 Q! c7 ?# M7 |% K. U7 _}  : q" r- ~: j/ t' X& e
8 k  ~* ]4 I( r
catch (java.io.IOException e){  # {7 }( u) f0 E6 U* i* i% e7 K

1 R) e/ ^" ?7 V# h+ ~' ASystem.err.println ("IOException " + e.getMessage());  
6 V) \$ \  F* o6 S- J. I
3 R% V* Q  H( K% R}  
3 b+ p" w, W& o, F0 X$ Y5 O, @. \( ?( m7 M5 T
- S# R" n# I) Y8 P% t
问:  0 A. W8 f: Q% C& M8 Y
如何产生签名applet,以使applet能够访问本地资源?  ! e3 |0 o9 H' f8 _
4 e9 N. q/ O1 l- H/ C' V
答:  
+ F/ J3 }) g$ ]" l5 j. K0 N' h# d在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  * m2 R2 f, T+ G$ s3 A

$ f' t2 @' e- M0 z- f% d4 D1 m
- {- e6 ^4 o7 J2 N. ~//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  
9 M0 {. O! e' g
6 N# w: I0 Z7 }& |: Ekeytool -genkey -alias joe -keypass sign12 -keystore joestore  
' k/ g; Z: e0 g6 H' d) C5 D5 v- O' O, z
2 a9 ^  x2 b; H. @) H6 T//将SignedApplet.class及相关文件打包成jar文件  + Z, r' [' w& D7 t$ f

3 B) a  X# t- H3 x5 V8 sjar cvf SignedAppletDemo.jar  
% Q9 I+ ~3 H/ ^7 Y2 B: k* c+ c
//利用keytool生成的自签名的证书产生签名applet(jar文件)  
; R3 }# k% y- U
+ {/ f2 a4 z/ H( V) u3 Q, J9 ejarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  . l% u& m* o1 u/ F
' z/ \. g! ]/ Y& D6 f
//将自签名证书从keystore中输出到文件  
6 U) M8 {$ m! v) X) y& ^0 }& Q4 D! O6 c! N2 Y
keytool -export -keystore joestore -alias joe -file joe.cer  : |: S, n" n/ Q6 X3 X- c8 j# M: J
" B8 m. D0 ^4 R* t0 y

! D# a. r$ X# ]  W8 @! ?" U
5 s- e; J* s3 M7 j& U而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  " H' |0 I7 M0 F" W; [8 M" W3 X
: M5 I3 r4 p" W8 A3 E# l+ {; D
Joe编写的签名applet:  
2 I1 r0 i7 w' `* c0 o/ e  Q5 W6 ]' N; G: m- ]# n: k6 `
//得到Joe的证书并将之读入到密钥库中susanstore中  
( F7 z5 Y, E# f  f( \+ h! n0 ]0 u; p" g( |5 W/ i9 {
keytool -import -alias joe -file joe.cer -keystore susanstore  
1 Z3 H# Q) X$ t
9 T' P6 ^) p9 y1 K$ L7 U7 W; E//运行policytool产生满足Susan要求的policy文件  
+ g! O' {% o' J- p0 s" S. [& r& n7 x  z: g$ n6 J  q$ R
policytool  
6 E* Q2 k/ c' w8 J0 W
* Z1 j: X# H* R( I. t  q; O( }1 B//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  1 k5 j. v2 B5 D2 l, Q
, h0 }. w/ N! O+ O3 [. i3 Q; h% f
. \: J( H+ }' W

: Z# K5 v; R8 [; I$ P% Q关于签名applet在Java Plugin中的部署请参考以下网页:  * h/ Y; H% G* t* H  U0 i, ?

1 c  _  O1 r& v/ H* V. D8 O# J" ohttp://java.sun.com/security/signExample12/  
& t' ?- }* M* g, C$ E/ V) ^; ?7 X1 V* E2 a5 F4 t$ d

/ L+ b! y* O6 j# N9 O) M0 h6 Y" ~+ m3 t1 s  u1 Z8 l% Q
注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  
, H9 S0 q) |6 W# R. C- z' K, x
$ q: z) q1 R8 k( S# }9 n7 w使用keytool -certreq向商业CA中心申请电子证书.  
5 F( D. ~+ c) ^; f* x; y- U- Y3 M* E; N4 p/ E* T2 p

8 O, d9 _& }! A* u# Y  V8 N: {7 K% K$ S
) b- L) Q4 k2 U$ e, K
问:  ' |- v; z5 I* ~- L) W+ ~, @
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  * ], G6 }) e+ u% L5 x

; Q& |1 c  E0 w0 _9 m0 a答:  " x( ?5 l" q+ g; c" t
使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  5 Z( A. C; I& M$ O. I4 @4 }

7 Z9 S5 X2 n2 i. `问:  
. i3 C+ R1 W" T% Z/ p8 f对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  1 I/ G2 [0 I+ y

6 d8 O! b" \! z答:  / Y  t; G8 s6 \% D/ }7 ^' U
目前,没有直接的方法可以将对象写入到随机存取文件中.  4 o- g% N, }$ j1 J+ Z% O
但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  ( {2 |  \* S) T+ `- C7 G3 C9 l

2 ]; u7 e4 e! L' ^* L& ~问:  
6 x# k8 a$ X3 ?" |& g运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  2 S' n; ^& P& N3 k, p" U

# t& g8 {& j( H) \答:  
1 L( m/ B# n, ^1 u- C可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  1 b. E1 @/ E1 ^

1 ^2 s6 Y5 ], G! P问:  
, e% K, Q+ Z% I5 X使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  / T% O" V- N# L' \

; f) G6 A' o; e( n- K! @答:    p: q7 h# N5 X
使用如下方法可以获得PrintJob的实例用于控制打印操作:  % n4 ]/ a  s/ M, a

$ R- W  B* t/ t% e# R/ Y8 {9 G& A' C7 G0 @; Q9 A& I
Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  4 ]6 F5 R7 f) ~! N
  v( H' p- {# I' t, k" s; Y
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  - W5 A  U/ z3 U6 a4 ?

3 @( U. ]* Q+ ~) _. v9 Q. F1 F8 Fawt.print.destination: 可以是"printer"或"file"  & ]- T* ]* K6 a5 T% \5 m* S; m
0 H6 i7 b1 j, v2 |7 j
awt.print.printer: 打印机名  
# S* \8 @" O* t* }4 H$ n  v; h6 R( A- V' V( u3 k2 g; d
awt.print.fileName: 打印文件名  
, R1 t5 Q5 S8 H. l4 I- M  O9 Q- E) A8 @! l' L" |; r: r8 U6 t
awt.print.numCopies: 打印份数  ; p9 w( R( R; _1 z7 k! z" b" k
9 B% u; S, C' t. }" T
awt.print.options: 打印命令的打印选项  + M2 `# Q; t5 _3 v" Y4 J

( g  j9 a* d5 q: P/ E2 p7 x; bawt.print.orientation: 打印方向,可以是"portrait"或"landscape"  2 `' j$ t+ B' R

$ a. w1 U% e; Mawt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  , m1 Q2 L1 [( D- f. g5 ~
& C2 J, n  f; s  \* G$ P+ u
  p) K. I) k6 d- f

5 i3 f4 E; N1 q9 V6 @; w2 @; h* A+ l! g! v6 h/ F

# r" o5 {# D7 S8 L) @$ Y( l+ [% i1 n/ z" m
问:  
0 Q; l: |% S5 [; V在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  , J/ d! l) p3 H( D

4 v  W/ D, j7 `( s答:  , P7 y4 z" F2 U! ^# {2 C& Z
Thread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  ) y  o( J$ h2 Q) b/ R

4 H% `+ r/ m$ d1 F( n  z因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  
; [$ |  I" G! x* P' A$ g$ A, e2 M9 z+ P/ w
问:  ' t4 Z3 A2 ~# q, n
使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  
8 `$ k+ Y, g; z! M$ v1 j9 X" V, O) N: B
答:  - ^: t% H" y3 [+ e2 d% M' M) o
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  - _: l7 Q7 \  C

7 e, ^* a# r5 \# U( _4 K8 A# G$ w, n0 C2 G3 y
ResultSet.first():将数据指针移到结果集的第一行  
! ]- p4 ~9 l! G7 n* `4 q( e/ B) ~0 y* N
ResultSet.last(): 将数据指针移到结果集的最后一行  3 }! R+ J' T. h6 i8 `5 E# F. J1 r2 `

3 ^( |4 G- o  b& J3 |# a& BResultSet.previous(): 将数据指针上移一行  
! I) D, D+ f( f. A/ u+ U- T, q% H. W8 [

" w$ N+ i- N- {* r. Y1 `以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  
3 L7 @, c9 n' R9 @1 k1 l) Y
# i" U6 U9 V, ~  r
% p  x8 D" K/ U, K4 A- C. @问:  6 T9 a$ u1 ?( B/ D( B2 |- _+ N
哪几种Web Server支持Servlet?如何使IIS支持Servlet?  1 j/ l  @5 K+ T% Y

4 p$ T/ U6 T; d. B+ I答:  9 E5 E/ s2 l$ A# X8 C6 N
目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  
5 B2 V$ ]2 y/ L' K  B0 A0 O( O! a: x) q$ P  Q9 C$ l" t
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  . V7 g& f& M2 {3 O
9 \; ^4 q6 O! ]6 l" i* f) g
问:  
# V% i* N4 J, R如何在Java应用中将图像存储到图像文件中?  
1 y1 t/ ?: O  W# ^' B0 F7 b' I$ A
答:  0 e6 a1 ~9 I" C% \0 A
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  4 p% c6 D. G5 c+ S4 X: F
$ G$ L/ ^* X. ]* `$ P/ ~
1 U" }+ V3 l# @- d/ H; ~
OutputStream os = new FileOutputStream(fileToWriteTo);  
  R2 k7 O3 f/ z3 x+ m3 \5 T/ W
4 Y! f" ^9 L7 R. z* HBMPEncodeParam param = new BMPEncodeParam();  - s/ s- u. q' p& k- a; s

, I" r! U8 }! i3 yImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  8 q, `% _' v; X+ M, Y% c

* }7 d, |( R' C/ d, {, r( ?. B' Fenc.encode(img);  4 F7 v* ^" p+ e( [# |
0 |) z" _) D! Y- `: T) N8 r
os.close();  
6 ~1 `6 d/ X, i* `" y, e8 f6 k5 `" i* n9 S  v2 x, l- V( d; [0 Q
有关存储图像文件的编程指南请参考以下网页:  
' y" X! B6 b# `! ^+ |1 W' k3 u8 z
http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  7 I3 t. i7 r  ]: q3 N1 }

+ O1 {+ u: J0 o; T% O  r& Z, O' x2 K4 h" {! q
7 ?# E, f! n& \# y$ p; ]+ j: Y

9 Z5 u! s/ @/ |问:  / e( J, p# z7 ?) ^9 p" v
如何用Java语言向串口读写数据? font>  & V/ _* O! U- N, v" _

, s1 Y$ q5 p: a/ L: |, M9 m答:  
3 O( q; X& F+ F0 X) I" gSun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  
( D" T2 ]! ^6 V/ i/ \( o
9 M% F& b# H4 Q) B" J/ a6 y详细文档,请访问:<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-4-20 07:52 , Processed in 0.441630 second(s), 70 queries .

    回顶部