QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  
9 `6 p0 G4 _' M) k8 p% ^' T7 J% m" t1 M
答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  
$ Q5 j( c) t/ _  \5 ^& BJava 2环境变量的设置如下例所示:  / r" y1 I7 B* N$ D+ o9 m* K
Solaris平台: setenv JAVA_HOME Java2的安装路径  4 H: ^% E* H$ \/ g
setenv PATH $JAVA_HOME/bin{PATH}  - _: O! Q! i5 C- q) V( m0 L
Windows平台: set JAVA_HOME=Java2的安装路径  3 [/ g3 u: P: x/ j, L7 w
set PATH=$JAVA_HOMEbin;%PATH%  ! z" h& }( q2 c7 R
) e3 p( K- s# v# `4 r
问: 哪些Java集成开发工具支持Java 2?  
; s0 x% S/ N& f, v% U% J, c* O/ c: c% H/ `% Y( A' o
答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  , i* W; s3 I3 V

, }7 o/ q7 Z7 Q6 G2 O/ e) Y问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  
- x; s2 t4 |3 @- f( k0 V
& d  c6 B! I- V( ]答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  ! O7 u- U5 A2 H% i" }/ ?
    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  8 B2 @' t2 y8 G1 X# H4 J: n
    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  - o# ]& k& S. N  ?* v& N" b3 w
4 s/ L  {+ x  r+ @1 ]( D9 r
问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  
" T$ R+ m2 b( g1 I! B9 }: B
+ }% ~3 o* G# S答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  - p+ _5 n' x5 H3 A, O
' c+ W' V7 _$ L+ k- C0 ]+ [8 Q! ]# F
当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  
5 d) e  Q$ w% s# R7 Q, {0 _8 W. Y
4 `* Q+ P( ]' B! A' [6 l8 k$ Z# q' G
3 C( B" _4 P- mString native2Unicode(String s) {  5 p+ ?' p3 V& [. R- s. g
- }2 [" y' T+ `% S  _
if (s == null || s.length() == 0) {  
# N& o4 W) u' J) v# s4 f- X0 u) [3 ^" v& J4 T1 O. {
return null;  
1 |+ h9 |, v# y8 }0 F( Y6 V
! ^! Y$ W) j$ t. j}  & p& [  _! O1 A- E) k7 \+ Q

  d% l, p- n# N( r) z4 i3 Vbyte[] buffer = new byte[s.length()];  0 `: r5 D/ P* k

) d( U# s5 Z! [- ?for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  
2 V3 h0 ^# {- I: k2 t& @
* `7 e" \5 d. w+ C0 F& }8 Qc = s.charAt(i);  ' M3 z0 i2 H3 S
1 L8 ~3 h/ M6 g/ s% R
byte []buf = (""+c).getBytes();  " \5 z$ P8 f5 F; Q

! {) G9 n+ z6 k* d: V3 zbuffer[j++] = (char)buf[0];  
+ `. r" L; A7 H$ w
2 ~% q( R) Q/ W4 L: u$ N  i  ubuffer[j++] = (char)buf[1];  4 p" [% {) ~0 Y  h/ s) C4 h

& o  V: h) s/ s4 h8 X}  8 T; w8 l" ^  |( `) e5 P
( G( A) q" C+ s9 I6 G
else {  5 l, q; a* ~1 n+ N( a* r
8 t+ b9 A; ]* S
buffer[j++] = s.charAt(i);  
) `" J# o4 g" [& e7 p( T( k/ ~" W6 b. s6 S5 u& e1 J% l
}  
+ \( Y/ a3 }3 `3 I* {4 L
6 x! l; {4 R/ D6 t' ]+ g" T; j}  ( @3 v/ h8 ^/ O6 y' X5 o

' M+ F; C0 a$ J/ W, l. Qreturn new String(buffer, 0, j);  . Q" p3 O5 S( O
6 w. d4 D* P' f9 `$ |
}  
# x6 V, h8 j( _/ E6 {! f+ [4 l( x$ i. ^
除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  
: P* H0 b( g& m: ]' n
* I$ a- j6 @" r/ D% e( N! F5 l6 F+ f' u$ s" {' `# f$ m$ _( ^+ V
问:  
) A& \6 U$ ^( e" g* `' a6 T当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  - u) e, L# b; V7 S* c& v) C; Z

0 q% \( R  Q6 N1 u答:  6 I- r, Z1 H" s+ }+ i" h
javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  2 G) V2 W2 i1 V: `# }7 @# T3 t

5 e, {4 }! B* W( U. R) w% Q' A% {1 E. {- i+ m2 z0 T, c! @4 s
public void doGet (HttpServletRequest req, HttpServletResponse res)  
, e- z7 [0 ?* E* u+ ~  [9 l' S
, ]' o5 K2 x3 F5 j7 V2 mthrows ServletException, IOException  
+ b5 E* u; X9 y8 B# ~, A) k- @' b% v6 V  \# }
{  " s+ ?& p4 f3 S; Q6 c

1 c, j$ h8 Y- I) Qres.setContentType("text/html");  
# T. h% s, M: K/ V
/ b4 o6 Q- }8 Y) E) a- NServletOutputStream out = res.getOutputStream();  
$ ^$ R& n: Z) Y( s( l- G, q% G
" a' j. R" y9 }7 ~# lOutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  # {& k) }+ }' h1 p: c# W

( r& p. k# m2 W; P' p3 Mow.write("这是测试");  
2 b. a  r7 c; n" d! ~: ^1 H$ z7 y* ~: Z) T
ow.flush();  
* J; N  q5 }, v5 Y5 h; H- h
' y: g, w0 n: _/ ]2 Wow.close();  3 q- w5 C% r6 A6 N7 t: M8 r9 K( |

. ?( D) \' Z0 A. u4 Z$ g: d- d}  5 W0 B3 D- x/ R) D8 l

  ~( m# ?5 I! O& W' S* t
" B$ l! e0 c( K) b) O! T# w% A6 W问:  
+ a$ v! ]/ u, z如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  9 b1 J2 ^3 m2 K- S
0 d5 J( E/ b, _# p" ~
答:  
' s% w* X% n7 S6 [9 F' R有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  
* A+ e  V" S' p1 [( W2 |将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  
; ?8 M2 u7 ^$ x3 A( B& c修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  1 D1 `6 z* }; |% N# N
2 W& B% N: s) N7 J4 V8 M
+ q' v" ?8 W2 x/ Q! I
问:  ; _8 ^1 d3 d7 @% ^
为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  ( w5 B/ y3 O, d! \
7 F: {2 j* n+ A0 m  x! [; K, u0 {7 }
答:  
3 X0 J3 A" t5 s7 o机器的网络设置不正确很可能会引起该问题的发生.  ( a, P" K5 K) @+ ]. n
RMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  
) O8 e+ H- H4 W3 K5 l0 @/ S
% s+ |9 K& Q$ X% O如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  
3 G0 w( m2 E2 {; t0 p& n) l' A  K8 ?: c
IP地址 主机名  & F' v8 Y3 |' v& H: j
, l" t0 @2 {& d8 [# I$ D
如此设置应当可以明显地减少查询所花的时间.  
) S. M4 i# X& S- _3 s9 ?% u* v2 H8 A
问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  
3 o/ H" f: z6 x1 i" O/ E$ D' y0 D! Q5 p
答:  
% Z) C3 u' W& P; \: F9 t若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  , ]) k! U6 U! K

8 p7 J0 W+ j9 j' q! P- ~+ @
# B: q7 u2 s- ]9 E3 E) o: fimport java.util.properties;  1 P5 W: H( ]- c" T3 q& f) h4 U! U
" t* a& V/ h# ], u% ]$ F- y  t4 O+ |
.....  # }& C0 A3 H/ C8 I/ u/ [( N* @
( \2 E) v# ]6 E
Properties sys = System.getProperties();  
2 D6 b0 ?; c# W! i
7 j/ d0 u' S# l% \5 c9 {sys.put("proxySet","true");  % ?# g4 L; s- t

2 U: v1 R  g8 }+ ysys.put("proxyHost","myHTTP.proxyserver.com");  
0 w  r) {; g, n) M* c1 E6 [% d$ O
sys.put("proxyPort","80");  ( ?" e  g1 @7 T' k

8 T4 K, e; K( Q/ wSystem.setProperties(sys);  , G4 \6 I; |& d, e- \5 z

3 u$ R( w3 ~  G2 n6 p, r- \8 Y& j1 q9 C0 e/ t0 A5 C
" n" ~6 J; C: ^+ i1 \0 ~' j4 P
u = new URL(website);  
' f) `8 g& `( O# t, Y0 C% F; \3 p  w* w/ @! Y; i; D1 p& c
connect = (HttpURLConnection)u.openConnection();  
; E# O2 d" [- o8 F+ D+ |4 W$ V. \2 j2 j9 u$ w
.....  * ]9 p# ?* B9 T' M- ^& u
* P& L/ P* p$ Y9 j/ p- E
问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  6 a' O" O3 E! y, k( Z2 [- h
$ B2 Y# R- @* a6 f
答:  1 d; M* g# Z: j3 t9 v3 p4 y
JList组件有一个单独的显示模式ListModel来表示JList的显示数据.  ' Y) y* q; _' U" y
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  : r( Z! j8 O) o6 X  ^; `
JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  
+ Z' o1 x$ Q! V5 l# @. o当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  
, V- y0 P3 k3 M3 _1 [7 K( W- |( T$ Q# b. L* f: U0 d, N
问:  2 l1 Y$ w, C7 F3 b1 b
在Java applet中如何实现一个模式对话框?  
& R1 N$ V: d( t) T3 P- [  a4 x' x$ ^3 q1 Q7 ^. w
答:  
0 j5 W' G0 W7 H3 Y  p# |% z在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  
- r$ [& ?' b/ x# j2 {2 R; x7 \4 j9 h
; X0 s" j3 @3 P# y' m9 `. n; E6 i+ V& |
.....  
8 [: O! c) p! f# x1 l, r
# O9 P+ Z( ?# l: P0 m- cDialog d = new Dialog( getParentWindow(comp),title);  5 I/ \, F# W2 {# F6 l6 o; x
' w" r* S( ]. E
// comp为applet上的任意一个组件  - }  |1 e( p  |5 u$ }

! M) f# t) @; `8 ?....  8 r; X1 X9 ^! P4 @

% B. d) E% y, f. d& F9 R0 j) V1 E! H
0 U/ t: i+ _% H8 v+ f1 \& H" b( z
public void getParentWindow(Component compOnApplet,String title){  2 X% P3 }2 |! b* R7 N

% r! x7 g4 I  X2 kContainer c = compOnApplet.getParent();  
( w# H3 e; `; E- C8 \
' I0 I& i1 Z4 F$ f5 O: E# B$ \$ Rwhile (c != null) {  7 q; ~2 T# N3 u* y7 O- ^

1 R( b4 _, ?0 v2 S' P/ Jif (c instanceof Frame)  
" ~  U" `) ^0 X* D3 y
' y" C# n3 f( |% b6 j+ [, Vreturn (Frame) c;  
: I5 U! v4 A# f' s
2 z# \+ ~! Z) ?5 e+ O% Ic = c.getParent();  4 F! Y1 X3 l4 g1 _7 t' |( N8 t% W3 W
" b" }/ T$ K; E. ^! f! y3 @5 g$ C
}  9 N. F2 Y$ d# D3 d" u& o
1 n- p, G1 @" `* C  d7 _
return null;  
  s. e, m' @/ C4 b) Y+ ]$ N7 b4 X6 B# E" T9 w2 z1 |+ D1 ?/ m( ~
}  " [' v( S1 ~  i8 _. L/ _

( w1 R! g% O; b6 a" a2 Q0 }问: 在Java applet中如何显示另外一个HTML页面?  6 b, S4 n# Z2 K, @. O: F* _

0 V6 d& F2 n7 [/ b答:  5 s- X, |( G! ?# G
通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  
( J* ]8 K; K% g* a, P" i. f9 \" E4 i) T7 w% v$ V! ^& w" z/ s1 i+ e
问:  
! T. d9 L5 p; i$ {用JDK实现的签名applet,可否在Netscape或IE中运行?  
( |, l( m% q  V
! h) b4 C1 D  t. f" ]5 T, Y1 ^" R2 ~答:  2 z: {8 @$ ~7 j% g6 W% o" {6 @  q$ y
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  4 n, Q, d8 S0 t  b) }, K: p

" ^8 v; `$ C5 m0 B不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  # _4 \, a# V' Z# ^9 s. m; y

: F- p8 V+ }8 r8 C( W  ]如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  % d. c0 u! r5 x9 B( U6 m0 f

# Z+ x: V7 g: x: L# S问:  2 Z" f' J% r) z0 W1 ?4 w6 i5 c" P
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  2 V: e* r  w8 g0 Z' t
! q5 c% i8 Z: u
答:  
! k1 N0 k3 y; T0 G; F# D! c如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  / d' G0 O; ?: o9 c
编写调用C库的Java文件,并编译.  / Q; B: \7 n9 v' {2 ]$ ?0 G
javac java文件名  
5 ^' }! Y9 I0 }$ w. W# U8 o8 P5 K+ j  @4 T( v" y6 C8 [# q6 Z

8 k# F$ g+ Q2 ]5 v产生C程序头文件  
% I! I  Z+ R. x9 [7 o+ f9 a5 X. Rjavah -jni java文件名(不带后缀.java)  
2 R& O) K7 w8 E. _" j+ |2 ~2 ]9 L& Y3 Z% w. F7 j
7 B! b9 P2 U. ?- H
编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  ; Z7 ?, B9 ~7 o  d
cc -G -Iinclude路径名 C2.c -o libC2.so  3 k) `$ h4 r4 g' ?3 L
cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  
  ~" a4 B+ N3 ?% _) Z8 n% V, A
% @+ J' ~: X+ u0 R1 A4 f6 i3 ]( ]; P- K6 c: g% b/ {3 L
设置环境变量  
, G: m7 K# f" G& B  |. }setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  5 h5 r. f* }3 A; d) z/ L$ j5 E
{LD_LIBRARY_PATH}  $ i9 i  F9 l; o* x# k. q
; q+ Q* |: E4 f$ q

- N7 V; p( g: f运行java应用  4 x7 p5 _8 C9 ^  ?- Z
5 ]! |, Q+ g4 m+ S' ?

! ]/ H! c" V) d9 M+ R问:  3 I& y) T, G0 T
在Java语言中,如何列出PC机文件系统中的所有驱动器名?  
  T( f! n# l# p0 X& W2 E$ ?5 |
4 {! ^1 X0 ]. R" m4 U$ s+ {答:  
+ V1 I, n# M' E3 G1 `在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  
- i' t; x  z  Y  S1 f- o3 `9 v  z) t0 x8 v! j) F* m
问:  
9 w: f" k- [7 L为什么Runtime.exec("ls")没有任何输出?  % e) {/ D8 ?# T5 _- }# C5 \0 B

/ b, d& Q. C6 w2 `答:  / Q6 n/ p/ R! ?1 G" Z  z" {
调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  5 R& F# k* \. N- h* B

! r  H/ w/ j/ }: o3 C; ~$ M' [* {+ J3 f
try  
. d% O9 }+ _# W1 P4 ~8 i% b( [& N5 E7 X' l# e* M) ^
{  
% C% K6 S0 j+ ^3 l2 ?6 r
0 T) \# |. \' t1 {6 V: bprocess = Runtime.getRuntime().exec (command);  
5 G6 p  E. D" H/ [# D' N5 `1 Q1 N; [; Q- d- ]% d0 n# p
InputStreamReader ir=newInputStreamReader(process.getInputStream());  ' \$ A+ }' ^$ o- }

: l# @7 v% R! w0 l: HLineNumberReader input = new LineNumberReader (ir);  8 O( z7 w, V3 E% _& K
$ s* V: L8 x8 r0 k, B
String line;  
; D+ R$ `6 p1 s2 z; K: I8 u8 x) c6 p/ L: S
while ((line = input.readLine ()) != null)  
, j8 K2 E! m& T7 x* r9 D+ M8 c9 K& v# c) L0 G, f1 X$ I
System.out.println(line);  1 `7 Q& h' D' O

* P1 B2 X8 E1 l0 ~: N6 k}  
2 D1 N* G' j+ D. o; D! c# E6 i  T, l+ b  K0 n4 d; V4 Z; G
catch (java.io.IOException e){  $ a; q2 v3 E) r7 ]

5 F, i. }4 o, F& bSystem.err.println ("IOException " + e.getMessage());  
' |  C/ \( M  W8 X6 `) Z9 t$ I3 N
4 z# f" R8 C' ?( b9 ?}  
$ Y' T: B8 ]' p" n/ f& O4 {* t* h+ p" ]! {0 L- r0 O% C

& V, w) b: _: Q9 k8 {' X1 }3 v问:  : r; e8 I* A5 x% v; n: ]
如何产生签名applet,以使applet能够访问本地资源?  
3 t2 z8 K% O5 n, Z$ _6 S# K! m- e. ?$ f/ y( C$ B
答:  & Q. {; ^5 g- Y
在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  * U0 X  B0 X8 H6 O- }& e

0 L3 b/ W; \6 {; E
. [% c3 l- J% T5 P# f6 k//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  
! ]' W& ]2 o# g& E. j/ ^( R. B. j( \& M9 ]& o! k
keytool -genkey -alias joe -keypass sign12 -keystore joestore  * n1 U+ ]( V# E4 Q

, S9 _) M2 I* D; A//将SignedApplet.class及相关文件打包成jar文件  - n7 ?) C* j/ f, i+ x- @

, Z' n2 E/ T$ m- b2 o: Yjar cvf SignedAppletDemo.jar  ) T' k: U" \8 @- ]6 F
  x) E7 X0 G3 b
//利用keytool生成的自签名的证书产生签名applet(jar文件)  7 j7 r& Z- `/ U
# v- m$ Z, r( N; _1 N
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  9 ]5 S6 n; _+ [9 w3 y5 c

0 }5 S1 \5 H) l/ n//将自签名证书从keystore中输出到文件  
" w! B) A* ]+ |0 g& u( `
9 Z: M2 Y; l  U0 Tkeytool -export -keystore joestore -alias joe -file joe.cer  8 U; x. F, A5 D: v$ i# i
! h* Z. j1 r: G* u7 d- V  |

" R+ E  A: n: [: m" ^! T5 n  B; O0 C; y: C' X
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  $ p( f  ]3 y9 o, Y2 u! l

$ i( c# ~. ~! m9 CJoe编写的签名applet:  
  u5 `9 N" I: k" w% p  M
6 a' q' d3 X( ]  T//得到Joe的证书并将之读入到密钥库中susanstore中  8 D1 J6 H; ^$ r  P3 \! y0 Y

) U1 z) n# f: Wkeytool -import -alias joe -file joe.cer -keystore susanstore  
0 N2 a+ K+ p* d9 X
2 f; O3 ]; g, Y& G* Q' h  f$ y% [//运行policytool产生满足Susan要求的policy文件  
; _; E0 G0 k- j; B, b# ^% S) v! B+ A% O% P
policytool  
& s; A1 Y, H2 d$ n$ u; m: [# |# Z* b, h- `) K6 h
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  
' V) {1 R3 v1 m3 X4 c  |
* m- k( [% r9 d" S
! _" k& t: O2 z7 }3 _: ~5 \. A, N% ~1 C& w3 I" ~! O) F- K
关于签名applet在Java Plugin中的部署请参考以下网页:  
% Y6 w6 z, e5 _  Y  m! V$ G; A8 S' Q& D" d" c
http://java.sun.com/security/signExample12/  
* A2 B5 P  a1 k, W- Q% v$ B! q2 M; P0 e
3 o' M: `% G. Q4 D$ P
6 _+ V2 `! `' O
注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  ) p& m! |* {5 t9 d* V
0 e- x3 ?- O* E+ V5 ^% z
使用keytool -certreq向商业CA中心申请电子证书.  
2 L5 X$ P/ T4 d7 L: `5 @  C# C) d5 i

: i" U4 ]7 H) [2 \4 L
9 t8 ~7 G: S0 h0 i) Y  j7 o  x* E- W. c: m& s1 h% K2 h6 O( b- Z6 r) N
问:  
# z' e. B# M3 e# ^8 L3 z. j若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  
0 j1 H/ Z9 m) f& H6 D4 J
: }/ V: z. p  J6 Z答:  
4 q, d4 H# {, ]( o+ [) m. D( w使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  ; @2 w7 H7 k. j4 Q
# j; y0 ?$ R+ G9 h0 ^
问:  " b+ y( d. t# q5 h
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  5 ]/ @) q1 z# x) \6 g( v0 Y
7 C& s- U6 v5 w; g
答:  : {' T/ D9 [5 b# {) ]
目前,没有直接的方法可以将对象写入到随机存取文件中.  
* U7 t1 e( C+ ^) ~, X, w但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  ) @* l6 k4 b$ f0 w. j$ x3 z

: ~. C# V! z! p5 ]: e问:  
* {8 u. n9 J, k. D; e运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  7 \2 n5 @, A  h
# y# k; J5 ~+ D# h; X* Y
答:  
0 ]) }% c6 G+ L) N! a可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  
8 w% H0 Q( r$ s  p3 C3 T& a
  {# t$ b/ r7 G" a. f& J: B问:  1 f4 b  Y3 I1 ^1 i
使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  
% P& c6 g( `; m3 x* s
" J3 w8 e1 q8 B6 w" w答:  ! _0 K% n; t! G* X
使用如下方法可以获得PrintJob的实例用于控制打印操作:  ( ?" A" A) i: Q+ O, p* ?- o

  F9 e! v. T6 z( }. V9 A  U4 ?' Q$ X8 Q) `1 l* j8 p
Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  7 H, m# `+ N" C( z5 a

: A6 P- c  p! C8 P那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  
0 }& P- C1 V" r+ I- E: r5 Q3 ?6 ?; R& o7 V
awt.print.destination: 可以是"printer"或"file"  
5 D& x0 p) _" k
' X2 M, `! Q. j- l" Sawt.print.printer: 打印机名  
, I8 \1 e; ]8 P' D+ G
, f0 P, U0 i% X  [% gawt.print.fileName: 打印文件名  6 \5 J& I( E& s1 Y3 m9 B

& y$ K/ _, Q; `  n* Eawt.print.numCopies: 打印份数  
0 d) D: A0 a( T9 M
4 s% T$ G+ l5 hawt.print.options: 打印命令的打印选项  8 {8 w# j+ w- ^+ y0 j. K

3 i) }& |( f9 f/ f8 u+ sawt.print.orientation: 打印方向,可以是"portrait"或"landscape"  8 X! ^2 Q' S% t! g

2 @: h2 Y- U! d5 A3 n! e- o  F6 Qawt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  
+ e  i0 I. A, O8 C$ `
" D3 k+ L' L. \! D' d/ k" r) e4 B5 G
* p/ Y' R9 ?& Z( V, P" _# m3 S- f* ]8 Q. F, u  u) X3 U) f
0 j* H+ A+ k: n+ N; d

6 C5 p" R( ^* @( S- J
9 f- g  Z( {6 W4 o问:  / {( X& `0 Y. b+ K5 Y
在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  0 a  f* O3 W2 J: M3 f) w

' }3 c; @5 ]- B: Q7 j答:  
2 E/ s! D. F: }, U; oThread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.    z% Y6 U8 R& P: u( D2 z6 f
. \6 G0 h, m- _; x( b
因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  ) s2 O' O. N& G+ |" Y1 K

$ k( h6 w0 w8 S( n: v0 _问:  1 \  h4 ?) X) M" s" C! A" A
使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  
6 k. _& A; k$ F! n
6 [; ?" }3 t$ f2 V* K! Q答:  * n4 a. L2 l0 p1 e" x6 N2 h
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  
4 O9 D! B9 `1 u1 |* f; Q2 W
( B; y1 h3 A4 }+ ?2 D# q# D, A  Q; U+ y9 s* V2 S0 k
ResultSet.first():将数据指针移到结果集的第一行  4 i. s- r* i9 m/ F/ _
% d+ k7 p! H% g
ResultSet.last(): 将数据指针移到结果集的最后一行  
8 v+ A" b) @( X8 s0 y
: e0 F0 {6 Y2 L$ n& c: d/ PResultSet.previous(): 将数据指针上移一行  , M7 S9 `+ @$ T' u9 l! W( n
. k0 L8 m, n* C( _; G; _) g3 I( ]

2 y) k% D/ G; z- Y以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  
1 X5 F- \3 d; i/ z- I# k
5 j3 K' l5 k1 {7 d& R& X
2 A& g& y* J' Z7 N( A# Q问:  4 V9 P% a9 ]. X+ v
哪几种Web Server支持Servlet?如何使IIS支持Servlet?  
) Z% p) m# F4 t, M4 _/ C7 |  J' k! r1 c" E
答:    [- L4 H' y. t- j0 E, ~
目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  * s  `( P9 w2 {% \) ]/ _+ O. b0 B8 r

3 Z& _1 b( G8 K4 H. g此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  ! W) j  J  o' C" S4 I' N
# _! u  v  x4 ]* V$ o# u* \! y7 _
问:    C$ L" m: _2 f) E2 q- U
如何在Java应用中将图像存储到图像文件中?  # z6 ~5 \4 w: @+ g: `" r& ^" `
, ]) V1 {, w. j8 q8 o
答:  & ]6 ^; d5 U% M/ ?
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  5 K# Q% w! a+ N
# B# H2 l3 w3 f! f# O4 T

+ h) `5 q2 m: v8 W; S  ]- t6 OOutputStream os = new FileOutputStream(fileToWriteTo);  8 p9 S  x3 p. ]- Z
. t3 D" @- g% _' \& g9 {8 H
BMPEncodeParam param = new BMPEncodeParam();  4 B# W4 k0 {0 D" X

* |3 s4 w% Y) l9 M8 tImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  
' \. M9 w' k- e9 Y1 X8 g; e) A, C: \, }& D; R
enc.encode(img);  3 @1 @8 q# G! q1 w+ ?  B( L2 c
' h0 _5 A% b5 f6 A+ Z
os.close();  9 L) j6 [. O2 e4 A$ W

( a9 w# }* g2 ^+ ~" n+ }1 l有关存储图像文件的编程指南请参考以下网页:  
: l) |/ ]  s/ A$ P& \/ L9 h3 x. e
. u* `3 q, _2 {0 d% J2 q$ d5 t; d: Ohttp://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  2 D* Y8 b5 L* J! K6 q# D, q; [9 ?
  q& r- N" v% \
. `% [( O3 j: q" t
5 Z. v5 G3 y% H
! i/ o& c' Z9 }- F: w
问:  ) |# G, {8 A, R3 X) |# a
如何用Java语言向串口读写数据? font>  
, C( o  ], L9 Q5 u. G* x; C" L/ t. a- Z& _. Z+ _% M- {6 g
答:  3 f# ?+ M" X: ~2 A5 _- T& d. h
Sun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  
% u. r$ |0 D" h% `3 ~# C- H5 `# b  V1 _, s8 q# W
详细文档,请访问:<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-6-10 23:21 , Processed in 0.514830 second(s), 70 queries .

    回顶部