QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |正序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  / K* C: l1 }2 ^3 {( i! s
1 _' R* f3 ?; R
答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  ' V5 r; i, C' e1 E2 i! `
Java 2环境变量的设置如下例所示:  ; v3 p: W3 M3 j& I3 r
Solaris平台: setenv JAVA_HOME Java2的安装路径  3 e9 B2 Y: V6 c
setenv PATH $JAVA_HOME/bin{PATH}  : e. c5 U2 P2 V
Windows平台: set JAVA_HOME=Java2的安装路径  
+ S' b% P" E( j0 Fset PATH=$JAVA_HOMEbin;%PATH%  6 j! p' m. Q+ U1 i. V! K% p' o. a

3 y5 p# h! D  Q( r) C) \: L问: 哪些Java集成开发工具支持Java 2?  
2 U# r' ^+ E: Q4 t- T
' ]* S0 |6 ?1 f1 w( v答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  
3 d  i" `% v, b3 H/ ]2 o$ l# C: f3 q7 U* Q) @/ B( z* [% _
问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  
5 y) d& b9 B, l3 q' G* O! r! l) [& b3 K" W$ u
答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  
, v  V+ I3 y1 g: a, L% \3 b. H    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  
& F# ^) p  I$ F    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  
4 Z9 g  \* M' f2 q/ V- [, J/ x$ o% F) x8 M% Q& [1 H
问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  1 T$ a. ?2 M6 k( Z- B; e2 G7 A
0 P  d6 Z3 a0 m# B  }' y
答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  ! I( K* j! S5 @4 r8 o' v9 M4 U

+ l; n8 }, [! q" x, z: q  q& k当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  ( D2 ]. d9 m; z$ {) v5 C( M

* Q& l& k7 n9 d! [1 {/ P$ B3 U9 R  v0 l) ~
String native2Unicode(String s) {  
+ |$ [  h& o. c
+ i6 U0 S! @5 f7 _( sif (s == null || s.length() == 0) {  
$ }2 W5 [5 Q, P! _9 M- @" F8 A/ [$ x: F( R1 `4 z
return null;  
8 {* u$ B$ s! f# L
& E' M4 q+ U5 a! p5 C" h}  8 U& n! n: L2 [1 K' L2 m

8 S. A. s3 r0 Ubyte[] buffer = new byte[s.length()];  / W7 \, u8 ~4 k  S' u1 B

. q. }2 g5 k, |. M4 |for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  
! w5 g2 l" h6 `
+ c# p* O& O; {  V7 Ac = s.charAt(i);  
2 v# r6 }& e' ^8 U3 u
) H9 j  x0 Q) Z" fbyte []buf = (""+c).getBytes();  
" x( y6 G: l2 b7 x5 ~. S3 R. d2 P$ I2 @, e0 ?. ~
buffer[j++] = (char)buf[0];  
* i9 q8 q; c, P5 g0 a7 _% m4 A: @! q
buffer[j++] = (char)buf[1];  
# k5 O, j! B8 r1 D  g$ n0 {
0 ]- c! N2 v$ T+ G  b) G}  
$ ^" y7 V& {8 w4 g; Q' G
3 l. |* e. c& Y: A, Ielse {  
4 b" ]# T9 f$ |, j. \2 e6 q! n* m+ d. o2 ~8 w
buffer[j++] = s.charAt(i);  ; Z  B) _3 i, H; `6 r

7 z  W' D' G. b}  # a0 \; s( p7 T9 e8 B0 [% {

1 i# \" r" U- a}  . D9 {  D9 n( _
$ {. }+ y( l3 P2 p4 i
return new String(buffer, 0, j);  
$ p3 H6 B+ Q* M# r6 ?
" B1 g! P* Q% |: s}  
- i8 u+ G, \' Q6 }/ {' j
% \8 v+ n( C$ v# ]除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  
1 _3 {7 O. \% c2 {. o$ P8 q3 I! \" ?  ^4 N# O
6 L! G9 l; }1 p& I1 k! ?
问:  4 K7 l, E& Y; p$ c8 ]* n+ l) b
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  3 |5 o5 N2 u- P* z/ f& O

& @( k% ]) N4 ?; q答:  
) d# l+ K( V" {) hjavax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  
1 s% u, l& D2 v7 t, \/ H0 Y. K' J: X, n# g" P, T
) Z- W1 o0 _0 D; X9 y6 {
public void doGet (HttpServletRequest req, HttpServletResponse res)  
" z; \) |8 _2 A, @2 R2 y* x3 ~* u& a5 t& A
throws ServletException, IOException  $ K; M6 N* q+ [/ H* g

; ]  D! X' G5 r8 n{  % G! u' c  r. n
8 ^3 ^" q' X" Q, b% \% X
res.setContentType("text/html");  
2 C0 N# u, x6 o1 I3 h3 J" o7 E& j* ~' ?9 T
ServletOutputStream out = res.getOutputStream();  
8 t) ^: `+ b+ t# P/ b4 h2 X1 c
- v* R4 [1 F' y/ O" F3 ^3 j% Q: gOutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  / I* s5 ?) B5 T$ h' X% {, z

& Z; J2 F( Y1 V' o# }; s: A& n" N# zow.write("这是测试");  
  L4 {& b) K+ G% A( }/ R" t5 x4 S
* O# X5 L9 D0 J2 v' v' }: N8 oow.flush();  
+ @+ {  N7 t1 T1 e3 D6 {, W
$ F) u- T, p6 K) Row.close();  , l2 L# U. }6 E

& ?" N1 `" Y+ B6 n) E- w5 c+ w}  9 v$ v1 _! F' J  @5 T- }$ W9 o8 b
" Q- w! p+ _) h( B" l% |3 Q. B
9 ]* s+ v/ H+ Z  l
问:  
2 e! a5 c, q- Y- p9 s- V7 p% j7 U, _2 ]如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  
0 D3 ]! |$ e4 J3 X
4 H3 |. y1 \# A; @4 d( Z# B' p答:  ) @& d9 g1 Z( r
有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  % W9 b1 Z, ~8 L
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  / C& I  m. \; K
修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  $ C& d/ n' o1 f  [
! \4 A# v5 T1 |& K2 @' p

/ n* S* B3 V3 m/ B! |问:  
6 }# ^+ u; G% q4 ?/ u为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  
" T& T# S' ?, H3 R
0 t/ x3 q, N! r; L7 o5 m答:  
8 S+ i+ g+ M, T3 K0 a. J8 Q& o机器的网络设置不正确很可能会引起该问题的发生.  : X: o& n. Q0 v+ T9 g! [' x
RMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  
1 |) I; }% o9 B6 I; F& R$ p+ y! E: v- }9 d2 v
如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  
  Z" R' g2 M; h6 K
5 g. o. d: U: R8 x6 x9 O1 P+ t$ FIP地址 主机名    F9 L1 @9 s8 N& g9 o

, x1 G9 f5 h$ n5 o- v如此设置应当可以明显地减少查询所花的时间.  
6 E8 ?% R2 {$ S; u) c* M4 h% t" I$ [( c! I! T3 V
问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  
1 T; m. |: O7 v9 y0 T) h0 I& E% h' T: ^9 o
答:  
$ Y& E0 `. V" }% l9 M若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  
* o7 ]3 ]/ f  ~  l3 r: O$ x5 ]* K, n) Y" a* t/ P4 |: v
7 p' ?0 f- h0 y) e* P
import java.util.properties;  
5 }  _9 B5 I8 Q+ }1 _
$ ^+ j" w7 a* I.....  
1 _* k" ]  y) u9 k* y9 T) j1 j- T3 ^( F' U
Properties sys = System.getProperties();  $ N* B$ G: Q. O( G7 F! @) c$ k1 s8 d

' j" G; M' j, n, L" qsys.put("proxySet","true");  + i- ]9 @  C" {$ B/ _9 o/ }
* F$ }" h9 k! d* T
sys.put("proxyHost","myHTTP.proxyserver.com");  + r  e1 c: V. k3 G2 F. ^$ t
1 D+ k$ O0 `3 z7 r( [+ B: z5 z
sys.put("proxyPort","80");  
9 v6 I! m( I1 X- O" [' M! R
* I3 X( v. E# }1 hSystem.setProperties(sys);  + {. v- H$ }  C! a/ G

3 B) |% U6 D, a& M; Q- q; W
3 Z2 X8 J* @% c9 w/ t" p- K4 s+ A, @, Y% D. t
u = new URL(website);  / P; O# l/ g7 d* f

, C$ L# C5 v5 T- b9 k/ w" yconnect = (HttpURLConnection)u.openConnection();  0 T( s, S" T# T4 }. s9 ]
  T5 o6 S- C7 d6 B
.....  
2 Y; c" p3 _' H. ?2 t: V9 k8 D5 R
4 W$ a4 B: Y. o* F6 w" Z* G问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  
! M6 R0 S" v/ K9 N+ Y0 I6 g
2 w; {! b7 ]( m, B! N1 h1 A答:  ! k9 V3 f6 o: u3 z; T$ p  b
JList组件有一个单独的显示模式ListModel来表示JList的显示数据.  * r& H& T$ f# q+ v3 b1 U* H: N1 R7 X3 u
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  0 r. o) C1 m% m# M5 ~
JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  . X* s4 R, ?6 V3 S3 o
当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  
* ~: Q' B6 B# T; _% D6 P
6 }; |* G. }; `! M" }2 ]9 U问:  4 t" n( L5 d0 }& E, V
在Java applet中如何实现一个模式对话框?  
" d: a$ D9 b* ]& T/ _$ f( N/ O( G0 I
: c) w1 _7 E: Q/ u1 u* l答:  ; p8 r5 _) r# i6 ?9 a6 [4 E/ }
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  
9 ]7 a0 `: E5 Z( h; N' g" I0 j& f, ^
5 \8 [9 ~& q: A. T% E
.....  
' I, C/ i0 Q5 S0 p$ N0 m. P* ^4 j4 Y" i) P- L5 z
Dialog d = new Dialog( getParentWindow(comp),title);  
' s) k$ M7 ?) w( t
' i0 x0 [: Z1 ?2 w// comp为applet上的任意一个组件  , s6 e9 E' }# c, P' ^6 f

$ R1 K$ g* B2 [# \....  . E! U$ F0 m- M5 k  n) c

2 W. U4 }4 Z# J$ c+ \/ Y. w# Y% k
) A& a1 k; I1 l7 t; A3 U
  {- e4 T' J4 _public void getParentWindow(Component compOnApplet,String title){  - K5 \9 q; U& c; a- T2 O+ X
& T$ G8 r8 I  |4 P- G8 H
Container c = compOnApplet.getParent();  ; s6 M6 g( b9 e
  g8 {5 P1 A0 I% l/ q% Y
while (c != null) {  
0 h% h# u  P" N4 Y7 N# v8 T* |; i
- i$ C- b" }. q/ |if (c instanceof Frame)  ! K% ?# v& m) c) l
, P' G+ @9 Y& P  x$ J* H
return (Frame) c;  
- C. r8 t4 `& X
: o  ?  N6 t3 Bc = c.getParent();  * }8 X4 X9 m. \! ^

6 Q/ d8 Q7 T" C2 w6 E}  
# z2 i) d# B* q, ?. s9 c6 X+ T* D8 c5 _* f! l9 Z
return null;  
. W. p$ {) i  y' i* G6 L; h
1 [+ z9 p0 s( T9 a4 S8 Z2 N9 D# v2 ?1 s}  1 k/ x  ^3 q/ }4 T. V
9 J- U8 G' ~4 o# v5 \7 o
问: 在Java applet中如何显示另外一个HTML页面?  * y" g: g7 q9 i9 i. l) M

2 b& \5 N2 K) J' ^答:  
- A" k+ k/ b) {6 v( U. s% ]# `* \通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  
) b0 z8 I  H' M" c+ X7 B7 _( R  n
3 V2 Q% ^- B. V问:  ) A6 S2 n9 W( [# g* M0 X) Y3 E
用JDK实现的签名applet,可否在Netscape或IE中运行?  
2 o. l6 R  X) g. r! d( r& u% H1 Y9 r* l( b% H
答:  $ N+ K( q% c; U+ L) `
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  , j# B. S0 l+ [* j; D

9 N6 b1 k8 M. w2 I& d不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  ' V/ H+ f. s" E

$ ?+ ]! g% ?3 h- u) ^$ h如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  
( _+ K/ g! Y! i8 c( B' h, b+ f
! p( J; ?, _5 g/ v问:  ! L) P; R' o( O3 T( c
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  
% x) U. P0 W) P$ `) e  b4 X* z  Z0 P1 x  B
答:  
0 \/ A# g- O. @如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  
, g) x3 m6 J0 ?- A编写调用C库的Java文件,并编译.  . l8 ]8 m9 W  U2 M' h
javac java文件名  
+ Z2 k( ~- p2 P) o" t
0 F) G, t" c, b# m0 y
2 `* l" r/ n3 d产生C程序头文件  
1 e) u7 G$ \2 B) p# [  S$ x" qjavah -jni java文件名(不带后缀.java)  * N) a/ e; ?7 @( ?/ }0 p( O( \

% B! ]5 R8 i- F$ ^# Y! U
- G8 c$ Q& U! @  V编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  
6 X+ q- p4 |9 ]" t; e8 G. Ucc -G -Iinclude路径名 C2.c -o libC2.so  
7 p+ k8 N1 z! i: P& M- ~7 b9 y! l: [cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  * D$ c9 ^/ g7 p  o5 j; O

. \" W4 N0 m" ?& z1 p7 p$ z7 F1 X8 r' \
设置环境变量  
% t0 ]. m& h& ssetenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  
. @& ]9 ?( ]( F6 ?2 T{LD_LIBRARY_PATH}  
2 h9 D. M8 p! v: Y- O. S; R
# J) v/ O& ~' U8 B6 ~2 d
4 T7 N$ R& ?$ ]" C( m( H: Z6 f8 n0 L运行java应用  5 Y6 P( r  j8 d( Y; J, z! u& i. P( e  k
1 u. Q' |& A. X' h7 N6 W" z4 I
; W$ H4 t+ P) F) f
问:  - W1 ^4 @, ?" b* P/ G$ N
在Java语言中,如何列出PC机文件系统中的所有驱动器名?  / m. X; z' U; I. j

+ i& S6 b6 w2 J" P答:  
0 ]! D# y3 H' L+ ?在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  
1 |# [( U, o7 Q3 s# E, _6 W# n) W, g) N& U# b
问:  8 c# e; J; y# G/ [5 o
为什么Runtime.exec("ls")没有任何输出?  9 a# |; N# R6 l9 s* \* d
4 p9 `! [3 |' `: h
答:  0 a& B* e2 @1 l" }0 D7 V
调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  & J' j' c- S3 h. b

, Z$ F, U) i' r/ I' A
( l: ^5 a, @, t  [, W( T7 Wtry  & g5 T6 a: @3 p7 a" ?) e, @

+ V+ k7 ]$ ~& Y/ f! X9 y0 Q{  6 Q/ O; F! d& Y2 J7 J+ E: t

: l7 g; t& {  ^! C, y1 s" X9 Dprocess = Runtime.getRuntime().exec (command);  0 {2 `9 G" E' h

6 y+ U/ V, q2 ^$ s. W4 ]  u7 @InputStreamReader ir=newInputStreamReader(process.getInputStream());  ! T6 H+ ~+ i9 W2 A
/ z) t1 C% {6 \
LineNumberReader input = new LineNumberReader (ir);  
) e$ n3 T$ X2 R# ?3 [$ Y* J& i5 s' F' l$ X( L: \( a
String line;  
7 K; {' @( n& v9 I/ p
4 P2 F/ _, ]8 o1 m, g' [) w. T$ z/ gwhile ((line = input.readLine ()) != null)  5 z9 X& F- e9 d; o  q2 S* S7 B9 N4 l

! o% \  j% F+ p) _$ GSystem.out.println(line);  0 O" |5 M3 C! q* a/ X* {" g* X
' O* u9 T3 y5 g/ @' H+ Q
}  ! L, n) F1 Y8 i1 |8 z. {  G! i

" ~6 z0 U3 Y& B2 w& Ocatch (java.io.IOException e){  ( o# n7 W0 p' E) k
% D8 f$ W! ~( D7 ~; e
System.err.println ("IOException " + e.getMessage());  / \% [) ]6 F0 S! n6 s( m
; W- O! u" h$ V0 {
}  
. R' e  u* U) l' k0 m3 ]" X, B" ~3 j- _* ], Z9 c
0 ^- W+ y3 ?& L& F$ |
问:  . d, j5 s4 M: }9 A6 V
如何产生签名applet,以使applet能够访问本地资源?  
! V3 P) Q0 H% p; t" A
8 W; l# G1 L: Q) K7 }" Q3 h$ u0 [( ]答:  
$ A1 f1 h( g: ?9 C& \, K- W' S$ U在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  
  u* Y" @; l9 ~5 X6 O  x/ c8 t3 j/ e4 N" D* U4 K$ ~2 v' s# ?
& g; Z1 U: @! Y5 c/ u: [" h. s
//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  
- c& E. F6 f% L0 O8 Z0 Z, c1 @1 \7 _5 p
keytool -genkey -alias joe -keypass sign12 -keystore joestore  6 {- S  c' I/ f5 M$ _" q; ~

1 G3 `# k1 |7 o$ l! m//将SignedApplet.class及相关文件打包成jar文件  
" P. Q: {) q( `* z
2 j# c" I  E3 P( I1 Hjar cvf SignedAppletDemo.jar  
! c/ Z3 C+ d& W7 _% x0 N) e
! q5 q6 g7 s, d9 ?7 O. Y2 w& y: q//利用keytool生成的自签名的证书产生签名applet(jar文件)  
0 G9 u' i& t* }: v* ]6 q7 h2 i# P, Q% }
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  9 G7 H4 Y& c% ~( L, j) }" Z( o! N

+ R5 T6 M2 @8 V6 v6 K9 K( @//将自签名证书从keystore中输出到文件  
4 T0 ]2 y6 ^$ P) {! E/ S0 C- ^4 c8 n! M; _6 u
keytool -export -keystore joestore -alias joe -file joe.cer  1 S) S9 l6 ]8 M  i  \- p

6 N5 y# E: C9 ^; v2 i
" P& y) p$ c9 Z6 P5 F* s: v" Z8 l8 }, v* f
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  7 W- A* Q; m" v( @; ]2 ^
0 N2 }$ Q) y2 T5 T0 d" P8 Y: l! W
Joe编写的签名applet:  
. D  E+ \, p2 z8 W- s) L6 {0 N# H; V* d
//得到Joe的证书并将之读入到密钥库中susanstore中  
. _4 }: |; t& ~% B5 L: a. d
8 {0 ^4 F. }) A4 M0 }. X; v6 Gkeytool -import -alias joe -file joe.cer -keystore susanstore  7 K! |0 o( X) y
, N  X/ k6 Z. h0 E
//运行policytool产生满足Susan要求的policy文件  
) @6 F0 w# a) m$ W) V0 m
# _6 n9 J! o5 b: s$ ~4 `policytool  0 z+ J2 g3 R; c3 m+ z  r
( l2 I/ Y# X4 E1 I
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  
$ _( {6 w1 }: k8 [. H# Z  {7 b; m0 g

. J/ I1 p. G+ i; a( t/ V& [+ n  h) f( P/ x( H
关于签名applet在Java Plugin中的部署请参考以下网页:  1 i5 X3 R4 @& i# A
( @1 }6 X* X% v
http://java.sun.com/security/signExample12/  
8 L. s/ |) n& a1 N2 A" b8 d0 {1 u8 T& Z( e! O3 ?7 Y

1 Z4 x+ t9 I& R: s, F% v8 m, J- `2 u
' [* n. C% d9 E' e  E2 q注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  + M# p) ^' l# @

2 d7 w2 n6 ]/ s' U使用keytool -certreq向商业CA中心申请电子证书.  5 X! h6 y5 }4 d. Z( o7 U5 C2 X9 y  Q
* U' x1 C- Q# p+ U9 o4 z

1 D  z. {" E: z0 B
8 ~8 j/ e3 w4 W$ H% V! a
0 o* y7 y7 a4 M% D问:  6 I9 t0 p! {: m1 S3 |* |" X3 }3 S
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  
' j/ H; z" h4 D. J# J! I
* ~4 g: M) M4 }- `8 X答:  
$ v3 A8 G! w/ G$ u2 ?- d- D使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  2 b% o3 h5 w) J2 K$ o& y

" J: P% B* |) f$ T$ i& O. h问:  * o+ @* M" v) m3 B2 ?% k
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  - m+ J- r& l7 b: T; ^# Y; ~7 N( g% i
% m1 y4 n  ?; {% r
答:  
. X3 c  H" R, v3 K. J4 t, W( Y目前,没有直接的方法可以将对象写入到随机存取文件中.  
% {  V/ n- q$ Q3 n3 S& b: z但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  ! p. u- L! X7 C  f4 \
' [9 J' o4 B' ]: o
问:  
" o8 H( s" v* C5 W运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  + Y& _) ?) V0 B
4 \9 Q6 n; }4 S+ j! ~( O9 e
答:  
$ \& {% l6 ?  S可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  
/ h9 ?- q5 R% A, p: {
  \8 ?' D" F; h% y0 g7 e问:  , u5 B# r6 F  ~
使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  6 u" w& g- p0 w

4 L! k" {! F* W& Y' }* B0 `答:  1 Q+ z$ F0 s  a3 L* f) R
使用如下方法可以获得PrintJob的实例用于控制打印操作:  7 Q4 G8 c* Z% D4 e: y2 }

- h! ^7 Z) \, ?; U/ t8 Y
2 m9 e: l! j7 [" |6 K! r9 `Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  9 f6 H. l% c; P/ ~5 X
) P& C% g$ q$ h  n( E& E
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  
' X- t! C! S! m" H% m* Q, H; I0 P! t& F3 u% F: s6 W% J& I
awt.print.destination: 可以是"printer"或"file"  ! \$ S1 v( @) @3 D/ X* m* t3 j5 E
" y9 B* r  D  S
awt.print.printer: 打印机名  3 n( U2 h/ V+ o, U' R9 g# \

" a- U/ \* T% |% M- w0 nawt.print.fileName: 打印文件名  
, F, v$ X+ C, q! C$ m% h7 ^5 _+ ?. a- {( _9 Q# f& H2 C  Z
awt.print.numCopies: 打印份数  
2 [1 g& |+ y& |0 [2 X* [; L5 }! v
& w2 A) f1 W" c8 T/ ?! D( z$ z2 Tawt.print.options: 打印命令的打印选项  2 n9 A) Z6 ?. n5 A; _
, j0 z) P6 v  {3 V5 q) a
awt.print.orientation: 打印方向,可以是"portrait"或"landscape"  + C+ m$ }1 R8 r
  y( V+ M! \) h
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  $ N" Z' y6 r" d6 j
  t* x6 H! U+ P, Q

6 i9 K& T5 W# C- o0 u1 Z9 P+ c1 G0 ]# O0 f# {0 Y& M
# `& `# [( U' ]/ i4 u% Q! J) ~8 ^+ V1 Z
0 t9 [  `& i2 J& h# c, F1 }8 r& u

/ P& ~0 q# ]4 l9 Q: h5 Y' O7 c问:  
  \$ t; H; p  C7 e+ [在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  ' W6 j  J* x; o
* r9 a" A) M0 z) o  s5 M
答:  
4 N0 K8 e+ c* {' J2 ]8 M7 VThread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  ! o; c* n6 A# b. T2 L
( A& J+ J* m' e! {1 p
因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  # e- U& U& a0 |' I5 I& }: }
& @: A. p1 W6 l, l9 I5 [" O) i
问:  
( v" Q6 O/ i' c  r使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  
( F7 y. E0 H+ s# U, _0 _6 @1 W) g" a* v6 s, E- B
答:  2 u2 f8 Z$ b3 L
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  
- z! D, _) ]4 Q4 ~: _; C: g* J# v) x4 u. r2 D4 s6 z  a, J

  U  e8 o9 x' rResultSet.first():将数据指针移到结果集的第一行  
9 Y. j' M! G  {8 ^
0 s/ N' F3 i5 ?% t/ p' hResultSet.last(): 将数据指针移到结果集的最后一行  
0 V) {: a4 [# k
! `: d6 k9 s+ M. U+ }: o& U  QResultSet.previous(): 将数据指针上移一行  
& Y4 S4 h+ a* d/ q- X6 S2 m5 Q
" O# J6 J2 \- P! z% v  ^
3 a$ c) T" w7 C' P& n& F0 W0 \( A以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  
( W: e" l7 X- E' J& Q8 D3 r9 J8 O7 s+ z; @( K$ l

! ?: E& a8 \( o- P7 T问:  
4 ^  h% P8 B. A+ h6 H哪几种Web Server支持Servlet?如何使IIS支持Servlet?  
2 Z. \; O$ P; a$ f+ u  W- ^- o9 W$ T( |' a
答:  
  s8 x0 K* o( ]6 u目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  9 E# p2 O6 j: d# a2 X3 [0 H
9 j, ^4 Q5 o0 b+ Y) Q2 d
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  
) y" Y* ]3 G' W, r9 O4 S7 f: ?/ H! d1 S1 @
问:    ^5 V. v4 T* y0 h1 K, p! ?: H  [
如何在Java应用中将图像存储到图像文件中?  7 G) O+ c- w& F( Q; @5 L

6 C7 ~; M! w3 x4 b- \% k+ |答:  , Z+ |0 c4 {, f6 T5 k& W3 W
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  $ J" C5 k) O- P' X

6 }: v9 E% E  r! ]# H4 \& V6 {& i+ M+ e
OutputStream os = new FileOutputStream(fileToWriteTo);  
# f" g! |/ l/ g4 `' D$ ?& l5 S8 d: l, E" d( X3 F2 G% b% ^
BMPEncodeParam param = new BMPEncodeParam();  
3 U" n  A" k" h- W; J. K
/ r; D9 X  a  s# ~8 q$ @. g2 \; FImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  
7 ^" Y( f' {6 D/ B3 R/ T
3 e+ D- F& D, ]  b4 _5 ]enc.encode(img);  ! T) X& u' T2 W( y6 f1 w6 w3 M
( Y  |5 b& X4 ^( A1 r
os.close();  4 |/ c4 ~( M( K

0 R$ O- I- u; x8 m$ w有关存储图像文件的编程指南请参考以下网页:  0 H5 a7 V9 L5 `. a9 Z* l
3 C. \& p4 z" N( R8 H+ p
http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  
4 _, {5 k2 w- e( K7 I
% U( a! W5 a8 A! u) g8 C, }
1 U5 i4 X9 D" G' `# b0 @% w; W
; S7 O+ a, T0 U- j3 }7 f8 H, U) [' o- [6 Z, z4 o
问:  
1 |2 O7 n- ]$ U如何用Java语言向串口读写数据? font>  
: p) C0 Q: ]8 Q) K& ]8 e! C# ^: \% H
答:  ! p$ z0 k0 R" H8 I- [4 [
Sun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  
# [, ^: D8 d# q: Q, C& _) [' x- b/ Y0 G; w& e* W7 ~( c
详细文档,请访问:<a href="http://java.sun.com/products/javacomm/" target="_blank" >http://java.sun.com/products/javacomm/</A>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
deven1985 实名认证       

23

主题

3

听众

2433

积分

智慧的蓝色小毛驴

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

    [LV.6]常住居民II

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

    新人进步奖

    回复

    使用道具 举报

    wl820609        

    1

    主题

    3

    听众

    23

    积分

    升级  18.95%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    wangyu249        

    1

    主题

    3

    听众

    54

    积分

    升级  51.58%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-7-28 00:20 , Processed in 0.443788 second(s), 70 queries .

    回顶部