QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  1 u7 t1 _( g; G3 j
+ q, g8 O$ P2 a- \3 _- N7 c
答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  
. W" j. t. b+ g* p5 C4 P0 o* O! ]Java 2环境变量的设置如下例所示:  $ g2 y: l7 k, ^; J& U
Solaris平台: setenv JAVA_HOME Java2的安装路径  
  |7 K0 b% E. q3 Z; w1 C2 o1 {1 Wsetenv PATH $JAVA_HOME/bin{PATH}  
3 S- [! ?- P& a0 m* H0 I! SWindows平台: set JAVA_HOME=Java2的安装路径  / z& w+ l3 u& W
set PATH=$JAVA_HOMEbin;%PATH%  " A0 B, ^! G1 |. ?) t4 t$ I
$ x. [( m$ N* {! C1 Z
问: 哪些Java集成开发工具支持Java 2?  % W$ A8 R% p' s

0 E7 F& N9 k0 b. m+ m9 i答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  
: q& g0 }: g, d! ~' ^
  f( c& ~' |& G/ }; S4 s问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  ) v; d. q8 l# ?

% C3 s3 U4 q2 E8 x9 b答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  
# ~+ I& s5 g$ W; ^. x9 N/ x    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  
, ^$ i1 }! o  W2 g    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  
( Y/ ~3 i9 U( O% }, @8 f
3 ?! I( Y8 K2 C' z( k问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  
) P! ?, Q2 z: e$ \' g7 e( D6 k4 Z
答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  ) j" \" l9 j, k- G# w$ i+ F; B8 I3 E" H
4 F( k7 n! L1 ~/ j
当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  ' r' N2 ?/ f7 y0 Y

# I5 c; b& S- l, C7 _, ]. \/ y3 \+ t  _3 m. Y9 G: g* \
String native2Unicode(String s) {  / ]+ r/ k9 T. Q  J' x

' h* E* P$ ?+ Xif (s == null || s.length() == 0) {  
$ m- b/ f5 H( j1 {! _/ u
# W  a/ G! w* w& p+ s" sreturn null;  * X( k, X3 \. c7 @& P, |; t; z4 h2 X

4 G. [. Z6 f% D: n( a3 T4 p& T}  
) ~) \& z8 K* b0 Y
% z# v, Q' T  F: ^1 ?# {byte[] buffer = new byte[s.length()];  % {. l, S6 j3 s7 G3 s2 Z, ?3 n  I

( |3 c0 ]; G2 V) y* N0 ~for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  # H9 ^# O+ m9 K7 Q+ X7 Z

  }1 h# {( D# c* p5 _  d( Hc = s.charAt(i);  
0 m. S  f" r) a& D% _+ y0 D0 ?( j! H8 l5 p1 y
byte []buf = (""+c).getBytes();  
4 I& I6 b9 Z# b/ I; G, m" b8 H. z5 P" Y
buffer[j++] = (char)buf[0];  
8 D( e; Q: C4 y( t
2 q# P, D7 @+ k& L) Bbuffer[j++] = (char)buf[1];  
, l& F+ ~; b1 l( b1 o/ L, \+ y; s  z. e3 s( E1 `( S
}  ! u% {# ?* ~; }% s- Q

7 h' J+ ]( H% O* ^0 M. N5 r4 _else {  5 N4 ]2 x1 \  @3 ^+ L

2 C8 A6 \0 [! t5 z. E3 r2 ?buffer[j++] = s.charAt(i);  0 L. b8 B( a6 b& {+ Y" P% |

! ]3 _7 Z# |! H: g! i}  + E- @* Q) f5 S7 ^& O3 f) p
: T( E3 V9 L- x
}  / Y/ g2 R% f! x) b3 |1 c) _

" C! ]* s7 B. E# d7 ^0 [3 preturn new String(buffer, 0, j);  
# y0 q' h2 Y+ z- q  j1 w6 f  b  l; {- n2 E
}  
8 [$ ?8 H% X' d( d% M- G% z
( f6 @$ @! X9 a, U除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  ! V" R# c4 l3 v7 {2 W6 a; M
% S. g2 R5 v9 N) U, n' r
3 |9 x( G/ _- O2 |0 A7 L
问:  3 }/ O, B' c: V2 t- s; n1 d
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  
0 ?7 C' b/ j  b& D6 J# w. X! N, t9 ^& u& V) T
答:  
: B7 e- ~" a. p1 ejavax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  
2 x3 \, q* H% F; |) {5 C# b3 x
: @5 S- m+ ~& h+ f& Z& g: D3 y- w% C3 o4 h! c. `
public void doGet (HttpServletRequest req, HttpServletResponse res)  
  _( L5 u+ S7 `) \7 X" Q& o: [, x2 W+ _- p  `* h1 z
throws ServletException, IOException  5 `( r% w- A: u7 v$ X: _

$ c4 d+ Y8 t2 z: N+ s2 |) U{  . }3 i* d( b- D

( L1 T8 j  ]5 ^res.setContentType("text/html");  ' l, ^. b  s: o3 n$ M1 ]+ S
, K6 c0 L) v" R- t7 d' A! {
ServletOutputStream out = res.getOutputStream();  
4 t% |( A; c$ m( I, u; l9 d/ s) j8 S! f* l+ P  v: R3 R
OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  
$ Q& U2 ^- n5 Q! i) p! ]) `/ h3 ^9 W. F6 o
ow.write("这是测试");  
8 \+ G% f+ x; c9 }/ `  H
; c7 r! w( h( X6 W6 eow.flush();  
% N+ Y- k: m  @- R
4 v3 \( p# T6 `1 H& u9 iow.close();  
8 f2 f! `- a! S$ c9 K; c/ x' |* y; f- L6 c) |  _3 Q
}  
$ T7 ]/ O1 n- E7 n2 D; S) e5 c* X% \5 u- u* ^4 U7 [" f
* _" N1 t# l- Q# v0 z4 a
问:  
  g. C6 ~* H  O7 M如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  
4 x/ e7 w1 e7 n8 T2 ~! v8 u' |" [1 K+ _
答:  
8 r+ I1 n' l' O! k+ {7 C有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  
0 ?) J+ P1 O7 [$ V1 I0 L将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  
5 c  ?* u& v; |/ K* A0 |* V7 j( Y修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  8 \6 C8 O4 a" F9 L5 z: {

3 W9 U  U/ l0 F. s
+ ~/ b# V! G" D7 P1 t, \  U- P9 f问:  
9 c$ L: n- L. M1 e/ s" x为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  ' L9 l- H$ j3 d$ x( `7 W8 F
; {% g2 f( L1 I9 e% S
答:  " ?" `  {' N5 x- H; ?
机器的网络设置不正确很可能会引起该问题的发生.  + b1 U; X3 z0 _
RMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  
, J( S- s6 a/ h2 q9 c/ z& N
& L. N* T2 m- j) F如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  
' V  _* i+ y) N. V
% D& R: q/ D8 |IP地址 主机名  
# Y) T, m1 `. T# I$ r+ [9 a+ ^! g- U" i
如此设置应当可以明显地减少查询所花的时间.  
6 x4 D+ D6 ~7 h9 s5 h9 I
) s+ _- E) p2 f  ?" G问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  
; n6 e( b; M4 c1 N- ?3 F. E! v
9 t0 Z7 A. x0 u答:  ( G) T5 e- l2 e
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  . W* j7 n- [8 ~6 B& I/ V& C# B
6 x8 G" S4 Y9 ^3 T4 M7 s$ ?7 t
# K+ B3 c# |# J( {
import java.util.properties;  / P$ t3 z5 n1 s4 n

2 N, V3 @9 y, A.....  9 G/ y, K% B, A$ {
; t- D! I! w4 A, j
Properties sys = System.getProperties();  + g& @! Y; M( {, T
" I% I9 j0 n! G1 F: x
sys.put("proxySet","true");  , G4 }! A, a$ l& S0 P
# e" \& ~7 T; C2 |: c5 B* V
sys.put("proxyHost","myHTTP.proxyserver.com");  / V3 K$ g3 @' [: o

) a3 p3 s4 ]) [4 ^( ?sys.put("proxyPort","80");  
! }' _& j, F$ d5 i, _3 K8 |& z, K' h8 F# M6 u1 Q
System.setProperties(sys);  . i$ Z/ T: [5 p! ^' R3 u
! \6 f5 B$ v8 e6 r; X% r) `

; L% b1 V* s& ^. l8 {, ]
) W) y6 v" w% u# Y0 ]& j% |: pu = new URL(website);  ( P5 i' h% U. O. J1 q" P  j) X
0 M+ G( M, R7 Q; f! \, o
connect = (HttpURLConnection)u.openConnection();  
: Z( R+ I' V$ p5 f( W
7 w" Y8 J- \2 M1 F2 x.....  7 d; b; _" t4 V6 v, E( X+ z: y8 {# B

0 R0 E9 R; p  M/ N3 o, `1 `问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  
6 \3 V/ V( ~7 M: k7 r
5 n! I3 R6 u% W- p4 d$ M答:  " ]: }, u: m; Y- ?$ [3 M
JList组件有一个单独的显示模式ListModel来表示JList的显示数据.  ! I) c0 ?$ Z3 h+ t0 T9 n4 ^7 C
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  
3 U& ?% J% }2 h. sJList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  % j  F4 f% ~8 m' G- T2 T" x4 I' a8 b
当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  
( C* ]6 {) m$ j% i  N
5 M! ], K- j: T5 H4 ~5 U4 D# B问:  
; Z9 E# Z6 `& b& _8 N在Java applet中如何实现一个模式对话框?  1 T% W: ^- a' S

6 C0 P0 g* j5 L3 u8 a) c2 r( P答:  / e1 ?8 v* A6 i9 Z6 d$ }& o7 r
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  6 Q9 ?" D$ k& h9 g. p2 H
' B$ `7 y$ u! J9 i) g/ B- F( @3 y

/ K5 A* P0 L2 y- l( C& P.....  % @' P. I4 D- D- n8 w, W
2 @3 `  l) {+ U" g$ p; j
Dialog d = new Dialog( getParentWindow(comp),title);  
9 h3 ~# d9 l4 Z$ w0 x3 K2 p" T, r' e4 x! S9 V9 W
// comp为applet上的任意一个组件  
, I1 y1 W. X. B5 h# W  c5 S( h8 _; z4 b* A% L& f3 W
....  9 ?2 Z1 N- B6 |# O6 ~
  V$ q% P5 I0 A* K0 S) i9 M! F( c
( S# k# W, Q3 M

- F: D4 ^! |* _$ z( jpublic void getParentWindow(Component compOnApplet,String title){  
2 T& m+ G* S( U* m- g7 ?# q) F% b) B# W- ^
Container c = compOnApplet.getParent();  
- h" S. V6 d0 z( t" q8 A
0 D2 v% n9 u& p# hwhile (c != null) {  
7 p9 ?; n3 O. ]! t  I, L; `! Y6 _. f8 e, H/ ~4 o
if (c instanceof Frame)  7 s# ~4 k' P' [, l

' I/ j  `6 u5 j/ s3 breturn (Frame) c;  
, a' N4 l2 k2 X) h" A5 M! P$ n& [8 ?) S  a' s
c = c.getParent();  % C- q7 S/ p8 J" X. J

/ g; A0 n" g) T/ |! A}  * _* m6 o. j5 A# O: s# ?% P2 ~1 _

. y2 v. L2 p1 |+ Z  Treturn null;  3 o& v! `! w5 _7 a
% g) B9 k! e# @7 I2 y1 u
}  
# C/ t. y# c& D7 p" x5 b! R
6 B- q3 P6 Q! C1 K问: 在Java applet中如何显示另外一个HTML页面?  
# ~7 D$ ]+ ~; W/ n9 V
7 p6 c* Y  `! x: y2 t* e答:  * o6 b8 V, `  e  ?
通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  1 X' h3 S% A/ X# U6 P7 v* |. |
+ H+ D- ]6 k- O4 M# ]3 c- F
问:  5 ?4 o1 G3 L! d
用JDK实现的签名applet,可否在Netscape或IE中运行?  5 ^8 P, v& Z0 J7 M; |
6 Z/ s( z& u8 {- p4 t1 ]
答:  ( V7 L' x7 R/ |" b( x/ C
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  
. O- H1 J% y; |- k* |0 k' v  H% B$ w3 e. T- ~
不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  
1 ?# Q1 M# M8 B) D" @3 E" o
5 G& ]% @/ D4 Q, z( [7 x如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  4 w! W) |1 g- N# z$ h3 o8 t

' W4 ?4 q' z% H2 j& }$ n问:  9 C' n$ I: N" U7 t5 w( V7 d) ]
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  . G) Z) ^" V" ~0 D: i

0 ]( K  M. M) W答:  # j& \8 X0 \; k/ s8 E0 v
如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  
& y) `3 T( h" q( J- o" G% p5 h编写调用C库的Java文件,并编译.  
# P9 _1 V7 ?9 @( Z8 H0 d2 jjavac java文件名  
+ |* f+ s4 [7 M0 q: ?; G0 c3 f+ L( h3 O6 m7 e8 N
) X5 Y- ^& g9 Y, D
产生C程序头文件  
6 m( g& k# j- [# z$ w7 }  {javah -jni java文件名(不带后缀.java)  0 O7 u6 n7 w" k0 o$ W
( w; P5 I, O3 k8 f% p$ ^
4 z- g; i4 d0 o: T' W
编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  
4 Z4 q3 q+ i" w4 B* d/ ]7 B( n5 }cc -G -Iinclude路径名 C2.c -o libC2.so  3 K& _2 O) t; }7 E2 p. `8 K
cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  & u, S" W8 U. z  u

& @2 O7 ]" o' S0 W- Y$ X
, ?0 ?/ H+ x/ s! O8 x. O# W, X设置环境变量  
5 g5 r- K5 l$ v+ |, }setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  + }( F% N( I5 l2 _8 C" P1 E: p
{LD_LIBRARY_PATH}  3 G* F& ?, a# r" t
& J# X9 z$ {  L2 k6 J
6 v: ~3 k! R9 Y3 [. X
运行java应用  
& z9 _/ @) e- d  j# W- Q( U: }" ^3 J' a; a$ K

$ B9 W. Y! e; n3 g问:  
# G$ l" x/ H# N" z! b在Java语言中,如何列出PC机文件系统中的所有驱动器名?  
# S1 J. x% k2 A' T
/ i# [; ^  R, q+ X( m8 n答:  * ?. _8 i5 i3 }7 @6 o* ?- F
在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  5 I6 E& R) e4 W! O

! z  Q2 F* ?( ]$ @$ v问:  
9 L- E/ H0 i8 ~4 l( z为什么Runtime.exec("ls")没有任何输出?  
5 a9 `  e7 i! F) |
: R9 S4 u3 D8 Z4 r4 Z答:  5 ]2 u8 K( }1 u0 C/ Y2 P
调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  
0 [  V8 X2 R4 N' v6 J# g, R: L( Y0 I" F& `  F% W* e- u4 z! M
- s6 z' b3 X, v: m# p
try  
) a' m1 z& l6 G1 v$ l! E* T; K& x. ~
{  
4 ?) m1 u& n1 Q( z+ E
: a) n- B" q. F* Z1 U" a1 qprocess = Runtime.getRuntime().exec (command);  2 y0 b/ Z: D% b) C( R1 l# Y
# W4 b  k+ ]2 T
InputStreamReader ir=newInputStreamReader(process.getInputStream());  4 ^8 [8 w0 z8 e* Z( ?

7 I- V5 \) @- e( _# nLineNumberReader input = new LineNumberReader (ir);  / z$ [# a2 s0 u* M  j) H, c8 L

: X  O& u8 c( I7 XString line;  8 q7 r6 l% g) `# V8 D" C. w

* L. n$ B' b7 a0 ^5 s! \/ K6 _" }3 H5 dwhile ((line = input.readLine ()) != null)  
9 {* o+ R$ Y/ k
7 M& U0 q" n/ ^& t) Y& P7 vSystem.out.println(line);  ; I" W1 W( ]- L
  V, h$ X' L5 Y! P
}  
* z2 b9 k: |! a( V
. P* y" `' q7 z- A7 M* _catch (java.io.IOException e){  2 g. O2 |6 x' g1 Z
5 ?" ?! P9 S3 K, `2 F1 y
System.err.println ("IOException " + e.getMessage());  
9 a% d" D! D9 D+ c. a; U! l
7 |' f6 {+ f; u& _9 F  f}  " @6 |! V1 ]% P1 I

4 B+ ?. Z% b: f2 |
5 ?0 J' I3 m" @* g问:  
; [: a8 J) e5 m4 H" O; S/ }6 O如何产生签名applet,以使applet能够访问本地资源?  * x! q% m; i, w* H; ]% ^. Z" [

. z& ~# N! p1 c  h+ @$ P答:  
3 f8 E, M5 k/ J. I9 y: i' f在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  
# X2 x; @2 b  f& T, r; w; l8 [4 z  N9 E+ t

1 s1 M/ Z& g) R9 K& l3 z9 I( l. a0 Y//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  6 O+ q" B* V0 A0 d& Y& X1 U0 K4 B0 {
1 F' k! `7 \! s! _) d# m( l
keytool -genkey -alias joe -keypass sign12 -keystore joestore  1 t- k) P/ @. B6 V( j( F

( e" T( I: w4 x0 b' R: ^% e) t//将SignedApplet.class及相关文件打包成jar文件  0 m7 g! D# H# `. `3 i) V9 U' q/ M8 u
% ]. B7 h6 u) {" o) v1 ~- C6 @; U
jar cvf SignedAppletDemo.jar  1 v. e3 c, c( [8 F. s
9 O  H$ f3 C8 m7 Y1 x, R5 P: B+ m
//利用keytool生成的自签名的证书产生签名applet(jar文件)  
; Q# g/ J: Q0 G/ V2 l+ L9 w& q
% k0 ?) C6 h$ }0 w# Djarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  5 x& D2 W8 S, w: ?. j

  X- Z0 d& s( |) \. v4 j//将自签名证书从keystore中输出到文件  . H( d& U' b0 q' J) K

# d3 l( Q' f$ n, H1 x8 |* |keytool -export -keystore joestore -alias joe -file joe.cer  6 E9 s8 F& A1 w% d: b: {0 H0 t

8 c, x3 Q% N* b: T
5 u! g. @: D# u1 h+ |" d& N8 s' }  n9 y
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  # @9 _3 B8 L, t

& M' W2 P% l% Y' [Joe编写的签名applet:  9 S% t! Z' v- {  i6 |

9 \" }3 W) C2 @: ?3 N//得到Joe的证书并将之读入到密钥库中susanstore中  
( ?2 G: z0 ?, p# A6 N2 p8 |5 Q& t# I5 \0 g  Y
keytool -import -alias joe -file joe.cer -keystore susanstore  2 |$ j1 D6 T6 u3 D0 w2 r, c7 h  r
5 I6 b. i" b9 f% o' d
//运行policytool产生满足Susan要求的policy文件  ; I$ Z$ z) W" u
0 O3 f1 H, ^: Q' B) Y( w% h
policytool  
- H6 ?4 i0 T( V/ R" M
  n. Y, [# ^1 H2 Z$ ]8 r//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  2 s& O( x3 l, J9 Y. t

* `2 ?: ^9 [7 y+ D2 G
- C% a; t  \* C" q+ }1 d' \; L; v5 h
/ w4 e2 m: _% K3 S关于签名applet在Java Plugin中的部署请参考以下网页:  
, q* x! u- J3 l- k$ S" K0 j% Q
7 }. L) q" P" Q- V: m; e& \1 shttp://java.sun.com/security/signExample12/  
; a: Z  u0 `0 d" t* D
2 e! S- G/ U' q% z  p6 x
+ x" _' U* ^+ D( C! u
9 x% t* u7 x! |  d! a* ]7 c注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  
4 j. h) A5 m- d! S$ x0 K7 r
% w- P' w* e' m使用keytool -certreq向商业CA中心申请电子证书.  
; Y: R! o' h7 l7 u- E
. W, o+ Q4 }$ Z  L8 R% x
+ P  |) b" W" E' x
+ D& g1 W0 e* h4 G4 t- _' T
0 N$ j0 ^9 l& l8 K3 a问:  1 A7 m# K) y8 T; \0 _
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  
$ s) ?5 h8 J  Z# _! k( s
8 U) j; o: M; \答:  
2 ]' C& C: T6 t" n' N使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  1 O) N$ f3 a' z$ Y' b) N
" O6 r. W& p7 s% j  h
问:  
% j' m  _) i, e9 V) u/ v5 k5 t* t对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  : L* |; r% i5 M4 `4 @: p) f) z
3 Y1 }0 X. S1 C3 ]4 ~' j
答:  - M. {1 f5 U' r& b9 L; r
目前,没有直接的方法可以将对象写入到随机存取文件中.    }8 M1 o, X. s, g/ g) W$ ~
但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  
3 B2 h( D, T- m, o" o, F. L8 \9 U5 B7 ?" `  z
问:  
# r( w) x# n1 Y  }& O运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  
& q( Z/ ~2 ~3 G& c' n( H$ X+ V" g2 B' a6 x, x
答:  + X1 L# S. m& a' o# p
可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  
9 z' Q9 s" Q+ {0 R5 \- Q- |8 V9 s  C) ]8 ]/ n
问:  ! Q1 w- N9 U4 ?1 [
使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  
, E% J0 W1 }+ C9 Z! \1 L
; b9 Q* i. I1 O% ^1 j  D# `答:  ' C# x4 y" t. R, ?3 w% T4 [4 ]" g
使用如下方法可以获得PrintJob的实例用于控制打印操作:  * n8 k$ ^: m' L1 F1 C2 ^

, M7 W; H7 B4 i' L1 s* f  ^8 T1 D
Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  % a& ?4 c7 t1 \- Q: e& p
, c# A4 Z# K/ b' D3 J# k
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  
5 i; C& b9 n, ~2 C' C: O
$ Y% l- \5 j! d1 `awt.print.destination: 可以是"printer"或"file"  
. s% S' P% {1 z% h9 |$ v6 Y6 Y) }; E! p% N! C# C3 k
awt.print.printer: 打印机名  ( v0 @. K; t  P0 \  }
/ S. O- j8 H3 I6 D; {, o
awt.print.fileName: 打印文件名  
, P5 A; b# M* {: E; k; Q0 s5 u
9 s, g; @! L$ o6 A) z8 _  eawt.print.numCopies: 打印份数  3 m7 C* S# T' {7 v4 k3 j& Y

! A! q% d+ E2 C8 y0 S( \0 ^awt.print.options: 打印命令的打印选项  ) m5 J& h% V( T0 _5 ?7 q5 ]" `
5 e  Z2 L1 t! G# I% B8 y
awt.print.orientation: 打印方向,可以是"portrait"或"landscape"  : v- a5 J. f4 c0 c; h4 u7 T
' D$ ~7 T9 y; Q% ~: |
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  
- X! [1 z( k8 x! I# o; t' K9 v0 Z
! V5 q- ^# f7 [5 Z
) w" |: l/ K3 S; K" ]/ x* z

4 e2 p5 K; D, x2 h* s0 H$ ^# |1 \5 _* i% I

: j0 Q" [. B, K6 D; h  X! [( U  r问:  
$ g2 H+ \, Y8 C在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?    r: ?, P. ?9 S5 [- }
, T  B2 Y. S) w& U
答:  * C) f4 s& h7 {# ?( J  w
Thread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  
8 t. ?$ E6 e2 I0 W4 s! d' j+ h/ o4 D/ H  G) i
因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  
* n2 p2 N) p2 _) q7 h: ?2 t  s! c. _$ i. \! t
问:  ' C; B: B3 e) H1 p9 O
使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  
9 q7 G: i8 x; i# P( j) y. x) E, k3 K4 x  G3 _' c
答:  
  P! u" n  C  {' H% U* F在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  
/ V8 C  B1 l; R; Q
; [1 |4 U' P6 [) M" q+ H( L* d
ResultSet.first():将数据指针移到结果集的第一行  ( y* i! {& M* K/ t7 l9 b
9 ]7 C  V; E$ `, q! Q$ v
ResultSet.last(): 将数据指针移到结果集的最后一行  7 c& z5 r2 R; R4 j* d1 p# s9 d
- O( r* a, X2 X: h- S+ J5 L
ResultSet.previous(): 将数据指针上移一行    w' ?' Q2 E# j  a
4 D- C/ X( |6 X2 u7 V. E1 L

- b7 m: Z/ H. ]' l# l& M7 I以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  
1 W( J) E. i" L) F0 }7 k% v' T0 X- `7 l7 j

8 d2 ^: r) V- S, m; `问:  
8 _- |4 t: e6 J( X( Z哪几种Web Server支持Servlet?如何使IIS支持Servlet?  
% Q( g; K" L! L- Z* D2 a0 g  Y
4 V  E+ Q  m% H: ?. t答:  . D' j8 f6 Y7 `. O
目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  ' G# s" \: I& W1 {
# c& w# z# b# C6 X: m( f8 Y
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  # U4 }' F9 }$ l& l$ h4 P7 k

; ~/ G5 ~; u& ^问:  , B5 V6 `, o! O/ y# M, R
如何在Java应用中将图像存储到图像文件中?  
+ [+ D, k( J- a& Q5 G  ~0 ~+ f# U4 u/ Q" T& |1 d7 _" k; S
答:  
7 b) I5 v/ k8 g9 r/ SJava Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  
- ~5 S7 ?. Y( Y+ c8 `- E' |' f$ E6 V) A! P; H4 S
2 v( |, k& c" I8 B" ^- Z
OutputStream os = new FileOutputStream(fileToWriteTo);  ! P# W5 M  Y% x+ r, d7 E( H9 M! P1 u

( B, F& |1 Y: z# I  |2 DBMPEncodeParam param = new BMPEncodeParam();  
4 ~' X" o5 k  h, S2 d: @3 K$ [2 _" `1 z$ \
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  
4 O  |& D4 r+ O$ i$ P  y" M
2 p5 n5 U+ ]" ]1 n  tenc.encode(img);  
+ e2 w* D$ d" R4 H2 C4 X( W. c- J2 f: w' q! q! c  `" Y5 ^
os.close();  
. c, n) [+ g1 z" q/ E
! X7 d/ W2 K  @0 K+ U有关存储图像文件的编程指南请参考以下网页:  + [1 j2 H' k6 a- G$ J
: r$ L% u$ x' n1 m9 H+ f7 S: c
http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  5 F3 x8 K& J7 ?9 A- S) m8 K5 H
8 }" C# c* u3 |
" j2 @1 |+ l% |' W; ]3 ?
7 u- }4 a) V3 p7 C! \

/ E( R6 h, i  \' p6 T8 M, M( r# T问:  
" T$ K% l; I! A" J& @如何用Java语言向串口读写数据? font>  6 i  m, @5 C% @' Y. h: s8 N6 R0 N

" L. w2 J* g9 m% Y& w6 M2 h答:  / \, p0 }* D6 l9 V( I
Sun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  # P8 }% @- F+ M% Z5 X6 q

  h6 s& a9 \2 F4 {5 V0 Q" H5 }详细文档,请访问:<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-11 22:14 , Processed in 0.458201 second(s), 70 queries .

    回顶部