QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  
9 [; U& p2 Q: M6 g( R" f+ x* J+ @% O, |# a, b7 q
答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  
* q! G3 p) Z' N0 j* q8 VJava 2环境变量的设置如下例所示:  4 f3 \6 O, U) g7 l' I2 G8 R2 k
Solaris平台: setenv JAVA_HOME Java2的安装路径  
7 x0 V8 B  h, O1 tsetenv PATH $JAVA_HOME/bin{PATH}  ; x& Z1 Z2 s4 I
Windows平台: set JAVA_HOME=Java2的安装路径  0 t. B6 |8 B! ]
set PATH=$JAVA_HOMEbin;%PATH%  ; Z+ X1 A3 K, G

: H1 D4 x& B( d0 n, E2 _- R问: 哪些Java集成开发工具支持Java 2?  1 ?: ^1 w, f2 C/ k! g$ ?
1 v: Y8 ]( Q& ~  [: z
答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  
. l% ?7 u3 R1 ]$ t6 ?4 G( k, Z2 s$ R+ L& [# ?6 F: G
问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  
7 Z( [7 r4 k, E% R+ M
& D6 n/ m2 K0 ?4 Q9 @) Z答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  7 M8 I, J3 ^7 [# h7 F! q; N
    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  1 A$ X2 l+ J2 F: i: ^( U. J3 h
    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  3 P' {! s: N" F* ]' N

2 S& T: M3 z/ u+ r9 M1 i; M问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  ; {1 z, H( _* n$ N& s
4 N) X! |$ e. t  f7 O' S; F
答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  & y+ h8 W0 k( _* b1 o2 u
; n( S) L+ e) D
当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  
2 C; F" r0 y, w& y, A5 d; |
- y5 a% W* M. c6 B5 O* E$ ]! A) E1 J! ]
String native2Unicode(String s) {  : R: S. A) E: h1 i6 J

, M0 e& b- s$ C: b6 i( nif (s == null || s.length() == 0) {  6 I6 N, T( n1 i0 B$ ^
5 u6 ^% [0 W9 y  e9 R( C) Q
return null;  ; W$ b) n9 N1 s6 X, C: s
; X. |5 `8 W& I
}  
  Q+ P( P- \: {: [) v+ a; u. @% ~% c5 A- x6 N9 k
byte[] buffer = new byte[s.length()];  : A- X, V/ Q8 s3 d( b4 v2 D
: ]" @" E* \# x) P6 C3 h5 F
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  
6 L* k* J" K- R9 I" b/ E7 R% L' ~; }, h7 }6 V: z. T2 g# \
c = s.charAt(i);  " k, n- f* @3 V* z% y

/ }- O) f) P  R6 hbyte []buf = (""+c).getBytes();  
( P* w- z( }1 E2 D5 d
; b" `) G: v/ Hbuffer[j++] = (char)buf[0];  " ]. L/ \6 }4 J0 V1 D9 C; p- d
8 T1 I2 g4 ~; c. T' F
buffer[j++] = (char)buf[1];  
9 S: a6 [9 p' D3 m9 n; A1 c# ]; m+ f3 M; @7 X- `7 e
}  9 u/ M+ |6 n1 l* C% l( E, E

% ?  H# {* N$ p  [1 J& ]else {  
# {! P4 B! J  O) j7 ~/ c: f4 U! u0 b4 f, Z$ N
buffer[j++] = s.charAt(i);  
' T% V& L5 f9 g3 `0 P' A( H2 m/ R, r% O' o4 u% b
}  & v/ O7 A( @* k0 O4 f9 T
0 ]" z1 J1 g  d; s. x  X! T
}  1 q& V+ b  }# t% H# F: X
9 K/ T' q6 Q9 u! T4 `5 u5 l# e
return new String(buffer, 0, j);  
2 }/ V/ @9 g+ n% H3 v/ }# W! o! |; c* ?- A" }& Q) C% m
}  
' k( I, B3 `9 V" w, f$ j4 Y. z# C) H: c7 i$ H4 Z7 ]
除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  4 E. o0 U' C! \+ o) b
6 @3 a' V) g6 R& B  X% \7 |

: g/ k4 J% e/ d( I0 I问:  ; L! `% K0 S2 n5 M
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  ) n9 V. y9 L8 b7 {

8 p+ N' ?8 X) e" |6 V) n! l3 i答:  * D2 t" o. o0 Y" h5 B! d) W
javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  
. O- G% i9 ^9 k; M
  j- N" e# q2 ]) D" i
1 W% P. s' J2 t: p3 |" e* z& npublic void doGet (HttpServletRequest req, HttpServletResponse res)  3 V- u9 s% t, L2 v+ }

$ L, j( l, N2 bthrows ServletException, IOException  4 r# o1 t5 I0 a( d0 `+ q4 p
, S0 F1 Z& o$ z# _6 T
{  % W4 Z$ i4 C9 G  K2 F& |

9 s3 u+ b9 j4 s3 m* L9 W$ T, X7 d% lres.setContentType("text/html");  
4 c: H1 D6 ~. N* Q+ J/ C
. L/ I9 D- p" `1 UServletOutputStream out = res.getOutputStream();  5 z/ o. s( Z. P" b) J: d/ p

& o$ r0 R# r) @2 xOutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  ) n# Z& ?4 \% @9 ^8 ?3 x- W; Z# j
' c9 G5 F8 R! V' V) _: C& t
ow.write("这是测试");  4 g& L; E6 T$ P# w% V' h

- Z& S; ?5 `% j0 w1 K6 ?ow.flush();  / I8 Q$ e* L% _% ]9 s7 r: @8 S

" y$ H$ _/ W" {. V% S' E$ b! Zow.close();  
1 G5 P/ ?- G. l3 M
. |- ?( F3 R% j9 s' M5 R}  
& Q% V! B( P- ], m% I* X7 S  {( N5 g# _  E+ z
. h5 X' x9 b0 {( C& R1 |( Q
问:  ) G+ F4 C6 v( w) c
如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  
( \$ Y! y$ i) i- O" }: x' d5 \1 e3 Q1 V- i
答:    ]! ]. `8 i" v6 R/ I6 S, T
有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  
( V8 n0 F. G$ c% w$ d* D: b将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  
6 G/ t: ~5 F7 ]6 _7 a9 x# [* D( E修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  ' s% j/ }' M! s* I
4 r- n7 x0 ~/ ?% u: T% A) [

, Q. `' N9 {/ F3 u5 H问:  
: K6 `- c4 Z% V为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  6 z7 ]* l5 r, R  e

) |( |+ ^) O9 P答:  
8 X' f' ^$ r. _% f% ~# l机器的网络设置不正确很可能会引起该问题的发生.  
( a9 `4 Z: `& r3 TRMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  
% Z! C1 @5 m) }! ^
) F$ P8 A& W, T5 u$ L1 x3 _+ r$ y! @如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  
1 ~! X7 f4 |2 K* e
' S$ v% }5 u+ j, Y" `* SIP地址 主机名  
  M8 {' ~' f6 F& }6 h  ?3 d- ~% o8 C
如此设置应当可以明显地减少查询所花的时间.  ; o$ w# P, _% X9 w

  l7 L. _0 y3 i: Y& X$ U( o+ m问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  & m$ c' j' s$ t0 E

$ u! f( j* B, {% i/ a答:  3 R. C- C* D9 i/ N
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  # r3 Y) T6 H( V$ P8 L

9 n, ?' E* G2 o- t' G+ C7 A- g; Z: D9 t# _7 ?' x
import java.util.properties;  ! }' K2 G' Y/ K. V* q4 C; r: }

, o* o) C  Q! Z.....  
3 ]% _1 x5 N: b9 R  l/ B1 e' H
: a5 u$ g: w+ p* v& I; K! I) XProperties sys = System.getProperties();  
# f# U6 |& |" w8 A6 x3 S1 y3 X+ c5 i3 T) ]
sys.put("proxySet","true");  
( }+ ]4 s& y0 F5 h1 H. y3 m4 _1 s- Y$ Z, I  y% j) h, ]& v
sys.put("proxyHost","myHTTP.proxyserver.com");  + q6 |/ P" v; s9 T. W
, J+ A) q, }5 l% n3 r+ R
sys.put("proxyPort","80");  7 @3 y8 E+ A: W3 ^

' _3 q/ w( y9 Y- g$ DSystem.setProperties(sys);  
1 I+ l- ]" n9 j" {- ~9 F1 k) ?) W% a/ C+ B8 u; V% y
6 g) J2 G1 Y9 h. X

$ u# v9 l& U$ u8 K. C* Xu = new URL(website);  
) J& R" o. Y6 H3 u0 ^! }) f) ?. S% V$ i0 z2 j: A; Z6 n
connect = (HttpURLConnection)u.openConnection();  & _4 b+ ]$ Q! ], x( a& G

- [7 t! t' o- k) H6 T  ~+ m.....  $ [8 s$ j" {7 j

6 U- h+ J3 b5 U& g: O问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  " j" `' m# ~( v; l; D8 n) Y
- I' X7 l, e9 ]; q$ N* u
答:  % G  h0 @. B6 f1 J8 T8 g: V
JList组件有一个单独的显示模式ListModel来表示JList的显示数据.  3 r, G: Z* }; O% g: o
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  , I' M/ g3 d& d4 u: v) q7 I- Y
JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  
2 J3 K- v/ w( S7 T+ v( `: {. C当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  8 `5 ], `9 Q$ V$ Z4 f

  i. l; H8 B. l) C: f问:  
5 x# I8 X/ D" @8 W在Java applet中如何实现一个模式对话框?  
8 O& S% i6 Y: ]6 Q4 w; @8 b; I& b1 {1 j  J3 G+ j
答:  . P/ _: O- m6 i/ }2 d4 y
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  
$ {/ L4 _- Q$ v; I: n( Q
% b$ y. R$ q5 C. e7 l; y$ K$ o
& S4 n% J$ Q7 X.....  
9 y7 E$ ?) x" o; _
$ G) c8 L& _' |: K- gDialog d = new Dialog( getParentWindow(comp),title);  
# D& q) T7 N4 o( H, \1 x, n2 u+ o
// comp为applet上的任意一个组件  
# q1 n! k* u5 H) B7 D1 P# o& C& Z
, B5 z4 ^+ U, l: L% h....  
# P8 G" T  m7 n- h3 a
/ c3 I7 L5 n7 y$ {; W- u( j# Y$ Z9 M
% S  j+ H- [' _4 z& Z& Y, P7 _
public void getParentWindow(Component compOnApplet,String title){  : u  u7 H& W  P0 X8 y7 r

& i* n. y. j! f* A, H6 c/ c0 IContainer c = compOnApplet.getParent();  
- l7 V5 F; U( l3 j% a
3 M1 @" `' R+ D9 A% n; U' ]# ~while (c != null) {  * m  {6 ]6 `* N; ]" c: M9 J
8 |: p5 }2 k1 j4 D% t% P/ B" O  |
if (c instanceof Frame)  ! F; P7 n# R- Q! o5 M4 [* c
8 a8 c6 w5 ?  y9 @0 q
return (Frame) c;  ; M# d3 Q# U" u
7 P/ Z8 a( {6 i/ w( L/ Y
c = c.getParent();  6 C0 }9 c9 h) W  i" Q3 S  H

, @  V: ?" f8 h5 Y/ a4 {$ ^}  * S; {8 c8 p1 x: o7 x- j7 d

8 p+ A+ Q5 L, Creturn null;  4 `6 F9 L2 s% s* r' N3 l6 I) Z4 d. A
. ]) \' r% h! q% f" Q9 @
}  . p2 F* ?8 z+ L6 l3 o3 V
9 F' T( ]9 [& i$ L* [2 P. a) B
问: 在Java applet中如何显示另外一个HTML页面?  
& X% a1 Q0 c$ a: c
' i4 w% _6 I2 N  Q! n: y/ U答:  
  d% a6 o  K$ l) Z4 t* S7 i通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  
7 K6 ~% E1 s- i. G: R% Y1 [2 N9 W: p6 s! P* d0 \. [3 o! t
问:  
/ X& T. g3 _9 E- ]用JDK实现的签名applet,可否在Netscape或IE中运行?  9 b0 c4 ?( z" B5 [+ N

0 D# A1 v$ h2 n. Q& H+ H5 }! W! i答:  1 m7 o, Q, T# |, m! L0 ?, [, W# k
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  
! t3 E4 t8 e! {; t# P7 d' a1 x0 M9 |4 M1 ^) D
不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  ) U5 V& I' }0 {$ K5 u7 y+ K* ^
: C9 j8 I, ^' [
如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  
! m1 q7 k1 a* ]* k8 B! c' S' q
0 p/ S7 ^3 T" c, j! {6 V! `问:  
, _% Z( [+ g4 a用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  
; [8 {: \. g7 X6 X, S, _
$ h* C+ S$ O9 _  j# ]! Z* P& d答:  8 a% P7 J. R/ }$ t% Z4 W
如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  $ |6 L# k: y8 r; a0 Z. e
编写调用C库的Java文件,并编译.  
! ^# o# t6 F7 b; u+ hjavac java文件名  
7 o, A: S9 \0 ?6 P0 h' b8 q# l. e2 O0 O" D3 z

- c6 S  J5 q8 [, O" C) w产生C程序头文件  
! |# ~$ E2 T6 Y0 m' @javah -jni java文件名(不带后缀.java)  5 v8 O) j/ ~. e/ x

" K( I8 Z  C) u- n: u$ Z& D, x! a; p9 u0 N+ S
编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  , Z& p+ Q. u) G+ u& d8 A4 k# W
cc -G -Iinclude路径名 C2.c -o libC2.so  " i, W  k- B  M: W8 N; D5 H
cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  
* e/ _. J3 v4 X( d, Y- ?' n9 O! d0 L% ~7 J7 ~
% w: G* W5 x" W
设置环境变量  
' k5 v4 M$ k7 A+ ?setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  
  |4 `/ S7 Y/ r( _* r2 p{LD_LIBRARY_PATH}  
( @, P7 [7 s& b# p( l
4 i2 t* V  x8 s: Q7 Y9 Q5 Z2 N
' {6 S$ l( @& s5 x* F运行java应用  , Q' u+ C. Q. x/ Z) p
/ e8 z7 e/ @4 z0 J: f3 x
8 x& i" l0 z5 Y. [
问:  
* m- X& f2 l* {  s/ Q在Java语言中,如何列出PC机文件系统中的所有驱动器名?  # E0 C9 t9 S, x& N8 H' u4 x
- Z2 A0 @$ l8 \  x) x$ l! [
答:  
1 E- E! Z' r- B& [# M4 A. y在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  
! ?, t" m  k. W
$ E+ F7 ~( |, k6 T/ c( ~( n问:  
  O' K4 D+ @4 Y0 H. \; j# V为什么Runtime.exec("ls")没有任何输出?  
4 p7 W" U9 [. m* p3 Q2 T5 r7 [8 {
3 ?! u* i* `6 e答:  6 x1 D8 B/ Q  Y6 Q' m$ b
调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:    x7 f" l3 \- d/ ]  p
( W' N( t& y0 s2 b5 G

. j3 J; R: p. Ntry  . f( Z: k4 `" g/ e6 s: a' f
6 D/ y  L' r5 F. W; P9 t% P
{  $ ~! p* N( M' G) s2 f

, b, [$ r6 W) V. M9 I' eprocess = Runtime.getRuntime().exec (command);  
5 y  Q: X+ K# e) y* l- e2 U
# ~* X, a" u7 S1 E7 |6 d! W9 sInputStreamReader ir=newInputStreamReader(process.getInputStream());  
; l  U3 g6 D9 v8 `* d
! n. _  \3 {# R$ HLineNumberReader input = new LineNumberReader (ir);  
9 d  k  o2 _7 E5 }0 L% z# g
1 |; ]( m) `, p2 @7 PString line;  9 ^# _& A$ ~% z% ]# y( [

3 @& S# r3 k: U/ zwhile ((line = input.readLine ()) != null)  2 O% V4 G/ R% ?: i- j

! o  ^1 A7 _" |0 h" [System.out.println(line);  9 B# E+ P0 ]4 q- y0 p; l: H

+ ^! l, Y: X3 U3 N+ K}  
& I2 M4 g% B' y: Y+ Y1 D* F) i+ ]
- \& R9 V! S& d  }catch (java.io.IOException e){  
' O, {: L' F5 f7 u8 \
( f! f8 q. w, A& E: R* ?System.err.println ("IOException " + e.getMessage());  
. a3 o7 Y2 N# F- K! E2 ~% B
( b7 \$ |" b" U. m  Y% j3 V2 Z, P" a: o}  ) K( J/ O6 b3 ~- t  z, p

! Z$ l) C/ D, W( c6 A5 k! D9 V! |3 O: k% ]7 ?6 M# U
问:  / `2 o9 h9 ?  D7 c  C1 L3 K. m( Q
如何产生签名applet,以使applet能够访问本地资源?  1 o9 b2 |- p( {$ O! T$ j

! c* U. h3 z7 A, j$ S' s答:  & S( X5 s8 a  D9 Q, ~8 J( v
在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  ; n- n+ j# R- D' s" W# O- M! \

& |5 H. A  u9 a4 Y+ {
! r/ d, f: p9 P  H/ J//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  
0 |* u4 U  ]! Y/ T" l# w# s0 h6 ^4 E$ }% c( i9 H
keytool -genkey -alias joe -keypass sign12 -keystore joestore  3 o5 A, Y& G  H  n

  ^2 S3 k" F0 f& b//将SignedApplet.class及相关文件打包成jar文件  " j8 b7 U& ~# u# }# u
$ c' V% }# A& ?. Z$ U( T
jar cvf SignedAppletDemo.jar  
( d' y+ D  P9 J4 @6 h8 I- Z- u0 H$ \) k: e1 H
//利用keytool生成的自签名的证书产生签名applet(jar文件)  
8 q9 }) E6 w2 w; O" l! l
8 @+ g' A, D+ }5 I' sjarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  % v2 O0 J2 Q- ]: @( \& [

: k# O: y* I, q# t1 R! l//将自签名证书从keystore中输出到文件  2 U  l- @9 h$ N, D2 o. J
  K) A1 ~8 r( _) f- |4 Y
keytool -export -keystore joestore -alias joe -file joe.cer  1 r, F8 M5 }4 `  E

% Y& m" G, l( L. r" p4 u! q& t1 M3 d* o0 W1 K! P3 {

  V8 M* }# o: I- r8 w. v. g而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  - D/ s3 A. K- A( j# ~
+ C) R7 }! N3 b7 m' A7 F
Joe编写的签名applet:  
$ ]2 J' i% o" ]) K) u8 W
4 ~" J1 n* `2 L- v  f3 C//得到Joe的证书并将之读入到密钥库中susanstore中  
# @) g- D+ k8 i3 W6 f9 I4 t2 e' M* l, ~5 W! o. ^9 u8 S
keytool -import -alias joe -file joe.cer -keystore susanstore  4 s: ~6 y" i* [) Z0 E8 f

0 k) Y  i( ]3 H6 U0 H* @+ r* A//运行policytool产生满足Susan要求的policy文件  # l9 k+ ?% j+ `
5 R0 Y5 q8 r. p, [
policytool  # B4 f" d, ~1 `( s$ m5 g/ M
* l& a/ M8 E( s
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  . W( B9 x( C0 G: L6 o' r* @& l

5 l2 g& e" I7 V* h3 m4 E4 F4 E( I. m/ ]) x# }

2 q7 V$ e$ q, n6 {. u+ s) X9 A6 p关于签名applet在Java Plugin中的部署请参考以下网页:  2 R5 ?3 m+ t4 b; A# ?! @/ d" c( B

3 a9 {! q( s0 F; @3 chttp://java.sun.com/security/signExample12/  
$ Z8 ]1 Q# n- z) B  F
' t# L5 {# I, i& w- m! \. W! q% j* o
/ M0 A7 {6 E6 b8 h: u/ p7 q8 m8 j: ?, B& K, e. I# X
注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  . a0 C6 U5 M4 @5 R5 q; s: |
) s. |' a7 p( g2 x+ j
使用keytool -certreq向商业CA中心申请电子证书.  
2 E! b) j: ^- Z1 u$ h; n3 k: `

# S: y/ W+ F4 R& J- Y& a# \4 d& X( k0 k* Q/ y: a& n; t7 M
; ^/ m8 K4 k; r
问:  2 y# ], ~$ M+ {* Q' K& L# V
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  / h4 F* Z4 ]- H$ P9 E3 D  Y

' M$ `9 _' I8 v% C; D4 p答:  
- r: h$ a  ~; [: P6 M) {使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  
. T8 K3 ^  S9 @  r/ Z$ |) N, ]
5 G. _# U6 R+ G2 }问:  0 l/ V; n2 E. E' |, Q: ^0 M; }0 i
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  
: t; m% \3 g- ?) G8 u. `, C9 \
4 i* R4 ?* S* N2 z答:  
4 w) e# V! Y8 H3 p8 P9 y目前,没有直接的方法可以将对象写入到随机存取文件中.  $ `0 U. V6 u, d8 q9 `8 q* s% K
但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  1 P/ S7 U* K7 O% n4 [# J
9 k: U- B# w' X+ |. p
问:  
: F, y. T& ~! T8 R: A6 n8 c) N运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  5 q6 f: v& K/ w$ L

5 L8 y% O0 K( q3 ^; h0 s! G答:  
* V& c1 s' Z: z+ V7 Y8 ~6 `可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  ! y8 g9 w4 T! b: t7 Z

- h+ `+ |4 l: z( r2 T问:  
) ]2 @  E# [1 I5 i7 `0 A5 p5 \& P使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  + V6 ~/ @9 G; b) X9 _

# T0 n1 r6 U2 Z答:  9 ?* ?6 J2 x$ I9 f4 E. {
使用如下方法可以获得PrintJob的实例用于控制打印操作:  ; }) L, l/ `+ y4 ~$ x( \

' i* H# Z- J# w# @7 n8 B9 O# r. n
# P+ T6 i5 C* E  H" z5 p8 MToolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  , h, a) `4 d. U0 n4 d( E% `( }- \
2 k" _) V8 p( y0 r1 \' l3 o
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  
/ }4 o  A% Z6 _$ T; w& e- b% n. d' d: V* k# m1 z
awt.print.destination: 可以是"printer"或"file"  
  _$ o1 ^3 n9 E6 H. [! X+ v% w, K
" n. B" F- m" e5 G1 g3 n, Iawt.print.printer: 打印机名  
& h8 y: g, o  E; Z5 H& d4 U4 [' ^! ?6 U) x$ G3 T
awt.print.fileName: 打印文件名  . ^" E9 z5 V; Y8 l) ?/ m! M
( H: i" A" _% y% j8 |! I
awt.print.numCopies: 打印份数  # q+ \5 w) J* R: S7 `
/ V8 s% N" c. ~! [2 R% D
awt.print.options: 打印命令的打印选项  
& c) r, i7 ?, _; a7 `+ v, N0 l  P9 Q
% C1 y  e3 g% f* \0 xawt.print.orientation: 打印方向,可以是"portrait"或"landscape"  
! V' q# W5 i4 w, X0 h3 q6 s, H: G# I6 t- o8 H5 U3 f* F
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  
& k" g! E' s' O) [7 U+ r
$ c3 _1 E2 P$ G# t' K8 C" M: ?2 H( K0 N

$ V9 h0 |) d. z2 @  `
- _) ~0 b2 j- G+ s( Y$ n; U) Z6 N# o- |) h1 d( G8 Q

+ t. N+ H' F( |9 ^: u问:  
0 H+ S/ ~: o: M* a在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  ! E; Y" @. R4 u) z

, I# u; {9 y  \1 J答:  ) {4 D) ~  |6 z4 |* Y
Thread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  ( @4 T0 z& b" }- j* r. z; w$ [( U2 ^; ?

2 k6 z- n! r$ y因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  : y( O4 N, p3 Z) O

' R- V) q& W1 b* g$ W+ S; S问:  
  H: ^7 r. |- M使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  
4 |1 U$ |; r! h3 }1 _  P$ P2 Z2 Y1 A
答:  & p$ ?) c. H$ l; q  @0 k' t- r
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  
2 s- N, ]% n$ m6 A6 ]1 S4 \; R3 l8 s6 U  a4 [3 ?. n+ M
0 s, i) x) ^3 s, B# E0 l$ z) v% x
ResultSet.first():将数据指针移到结果集的第一行  4 e: g  p$ g( @+ f0 H6 y; F- }
4 t( X8 {; Y3 W2 d
ResultSet.last(): 将数据指针移到结果集的最后一行  + J/ j2 P- ~- y) j# S
: A- s, l2 a  _4 T4 q
ResultSet.previous(): 将数据指针上移一行  6 d' Q% V* D  Y: K  l+ B. s. I

; c% h) G+ H6 z1 A# k+ M. X1 S$ f9 S( Z9 j# L7 |3 J
以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  
$ d7 R  q2 G9 Y4 P8 s+ u
, D4 O& g( V9 @6 e$ p) ?5 L1 G/ v* [: O
问:  
+ [  [0 h6 U, I$ M( F, x哪几种Web Server支持Servlet?如何使IIS支持Servlet?  
  g/ m/ F8 c8 @: U- Z# `# }
" f6 S2 F9 Q; G4 a9 Q答:  
2 S' d+ [* J' f. R( y目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  
+ ^1 e& A3 }; o2 I3 Q3 y; B) {- Y; V5 ^8 o
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  $ y+ [: e! Y' ?0 V4 C; Q
9 A4 i, J& a. S/ K% A' y
问:  2 d2 p5 M" |$ V  O* V
如何在Java应用中将图像存储到图像文件中?  
# V8 F& P# e2 {. s/ e+ v
7 U# h$ ^4 Q' ~答:  ; P; |* t" V( Z- N2 Z* |
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  
4 U" q6 @+ @9 Y
' G1 H, r% [% i! r5 Q2 Q7 W  R: K) E4 X4 X) G7 W; e& b9 O
OutputStream os = new FileOutputStream(fileToWriteTo);  
( N+ X4 v% p2 Y
" `, d3 G. q* C6 V' OBMPEncodeParam param = new BMPEncodeParam();  
$ \1 n) ?; U! M9 c/ F2 }5 F) @
; N; }$ l" X9 Y0 U! T6 |ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  % P3 [$ [& @& B( H

9 d8 E/ b0 O' Y  N- benc.encode(img);  " i1 k8 e6 C5 L, E. I8 j

1 e3 [9 B& C4 x* ]+ I+ Tos.close();  
1 t2 i* K- y% n/ N5 M3 B1 A. D# t5 O- i
有关存储图像文件的编程指南请参考以下网页:  8 B" J6 A9 s+ O

% p: F1 w+ D5 L( q  F8 mhttp://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  + A% ~  s- s' `

4 e; J6 D" P' I; [1 C4 R5 t
4 w  p0 B# R+ `" v( r9 p
+ w6 b$ ~+ Z7 ^
8 D) m" U, ?5 P* Q# \) V: u问:  
) {1 T" o0 I$ `7 z. h如何用Java语言向串口读写数据? font>  
/ R& J- q3 |8 Y* ^; c1 ^" L: T- n/ @7 X) L
答:  1 L0 T' g4 P. l4 P/ W
Sun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  4 Q" V9 p3 i) V0 C  [

' m. G; n- a6 n* A0 g详细文档,请访问:<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-27 01:49 , Processed in 0.517215 second(s), 69 queries .

    回顶部