QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  
  T" ?$ n5 K# a! k9 Z  g' S
# `- X; H7 Z5 K, i答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  
, @$ S" f$ E6 z- u2 IJava 2环境变量的设置如下例所示:  " b5 Q& M4 X. b6 b. J4 ^
Solaris平台: setenv JAVA_HOME Java2的安装路径  9 F( r' }% v  w5 k
setenv PATH $JAVA_HOME/bin{PATH}  5 E" g- n- F/ v/ ~$ a& j9 A+ {
Windows平台: set JAVA_HOME=Java2的安装路径  : d! b% I1 k! ?
set PATH=$JAVA_HOMEbin;%PATH%  " T/ r1 s( X% S8 s

# J) K: L7 J. E- h, N  C- r9 B问: 哪些Java集成开发工具支持Java 2?  ; x4 L/ |! {% G( N
$ V  C7 k$ Q0 ^- {# I2 l$ ~
答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  
" z  t- V' K0 c4 W2 h, L5 U  o+ T( i& T5 w( A9 Z
问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  
8 l, t! K( u9 [8 q. R( K( M$ z8 \: x9 d$ H5 S* k: W1 G  w' V, l
答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  : R. Q8 @& ~' U& N7 _; X5 m
    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  
8 v  H, \- X, r. {% U    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  
5 D3 R! p- i& y' l) I3 s1 ?: a0 V: C) N
问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  
1 B2 ]5 a9 ?9 ^* o" z( u9 b0 m9 X6 Z1 N6 p$ z2 l' Y+ p
答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  
9 a5 @" ~" a" o$ C: x
5 a5 F2 X2 d4 x4 R当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  
' o+ J% Z* [- n* P- v  I6 v) W9 Q
+ _2 ]4 _8 V$ _) E8 A" {) p
3 {3 k. w, ~) w8 w6 q6 l% x' }String native2Unicode(String s) {  
% J& F: M% N6 M0 T( Q) ?  v/ z! V# z6 h
if (s == null || s.length() == 0) {  ' }/ p  P$ u9 Y+ c' M
. T" @& U+ Z$ w( h: }. }# U% E8 q( ]
return null;  $ M+ E/ J; v' F) @6 ~
) v7 ?* H5 Y' n$ X* p+ ~5 ]5 r
}  , ~$ m' q: C9 O
/ d9 n6 O- x3 l
byte[] buffer = new byte[s.length()];  9 a# @4 P' o3 W3 a

- \# P! {& ]% e% p+ K2 zfor (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  # P) F- m0 K- V

5 i3 l5 G* s* r; ^# v) ~4 E0 xc = s.charAt(i);  
6 z& h/ u. ?5 r+ e+ \2 J7 T% X/ e" _0 ~" j" o: Y2 i* @0 c
byte []buf = (""+c).getBytes();  
- q2 ^$ L$ x0 v6 ]9 Y' M5 Z6 ~/ x" P" {! W' F) L' N
buffer[j++] = (char)buf[0];  8 t( T6 s. Y" v5 l

# W; M! O1 w: q& K/ qbuffer[j++] = (char)buf[1];  
" e# L: h- h' ~( `  F0 n7 [# O  [. H7 \! p1 _2 H
}  " c/ f+ F; ]9 M1 i2 l( {+ N
$ ^6 P+ d- Q# d% g4 }
else {  ' e2 ]5 D+ R9 ^% g3 `: K
" w; V: z* B8 X: e
buffer[j++] = s.charAt(i);  
2 O3 P' o7 J; j3 Y
$ n& C6 X7 O3 Y: S, O+ v7 y3 c}  4 i0 M- D/ d2 l5 H7 b2 @, g
3 s3 P9 K" E. F6 [
}  
% _# g7 n2 H- k+ M( B8 s" b2 v) g# _7 ^$ `5 Z  g( o
return new String(buffer, 0, j);  
& R+ _  O. K- [8 ~
3 o$ g1 y) t7 `}  
& k- ?) w' L, B
$ H) k# a1 U# i* N# m( o" D除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  9 v( F; [) s+ I/ f1 g
  L8 A0 I3 v  i) T* e
: e3 y/ ^6 F& _) C  k& K# l
问:  % a! T- Z( ^2 g) @# R
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  3 h6 @  y- g) d" W7 ^$ O

5 K% }; m1 i3 `, t' b) g答:  + f) E# p: a3 d" z' K+ c& m  P
javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  
) E* i) Q% {; L1 {; U' Y* ^5 A" Z
7 y) _9 e3 \! B5 ?) {, h0 k, }# Y6 n, Q1 Y& N
public void doGet (HttpServletRequest req, HttpServletResponse res)  
: e! \, P9 k% F. }: q0 P! M( d' j% W' f6 @0 X" J
throws ServletException, IOException  
; d$ G& [- v* y  W/ O. `
% B: g- g# p9 P{  1 Q, U2 C* R2 Q7 F
8 v- p: q% B, s% J9 d. G
res.setContentType("text/html");  
" D- G9 {* S6 n
9 D3 [0 T$ t5 Q* U. gServletOutputStream out = res.getOutputStream();  & m3 N' @( G8 ^; f/ \; M

8 i& S3 a& j. f+ X; kOutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  
1 m/ ^: ?! R5 S, O( ~2 d! B$ c4 a* F
! J, o1 j9 }7 ?/ F' cow.write("这是测试");  & y- h( f1 g* Y0 c- Z' f" j* w6 \/ k

; N/ P* ?5 t* R. z* R/ iow.flush();  6 C, G" ]! I5 m- e5 S1 Z: C

1 ^! _, N0 K/ _" Oow.close();  - C  v' W7 a# S
& a- m0 U  _. ^
}  
* ^& t- K2 z* d1 e2 D4 L
9 E" ]$ j7 n1 F7 n7 y
" D7 R1 v# w  x& [问:  " Y4 {" M0 N7 `; I3 d) u/ z' x* r! d
如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  
+ ?, D' ^4 h, k* k
/ ?& G/ V# l7 @* ]8 p答:  
: U( w/ ?# A' G' p# K有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  
" }. O* t+ d0 G% P  A, l- ^将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  . f3 v( w% F9 v. N; t; p$ m. ]
修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  
) c& u, H. Y9 k; t2 g6 F2 D% R9 E# N2 M" c7 o: D
9 ?" l- A- t+ L' T
问:  
% l. @* q3 u7 m. |为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  
4 V+ F" y' y1 [# \$ D
" V- T8 c9 S2 V! C0 J% w答:  ) g, @: M/ c  t$ @3 K* C9 J
机器的网络设置不正确很可能会引起该问题的发生.  
4 Y! J8 b* X2 `RMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  ( h) n( j: [4 O; c

& P6 j' F6 R) o: l; A如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  
. F8 ?& ]3 S0 M! G5 K8 p- _! i2 j2 j  n, x
IP地址 主机名  
3 s3 h/ g2 `0 x# P
- Y8 h8 U; a) Y) r. d; z" r如此设置应当可以明显地减少查询所花的时间.  
- x1 U# B: w5 G
! ^- D5 C9 F( w! N" W' X问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  
% o. k4 n* X+ T/ q* o1 X+ p4 Q9 N/ L% l) W$ _* E0 L4 z
答:  
* z. B- i. u( l' Q" }* H若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  2 \6 t1 U/ a: g7 X+ v( j$ ]7 M& W5 b
/ j; u: t0 i1 E" u' A
9 H- x  T0 E; @; ]
import java.util.properties;    I- U0 ^: B0 L6 Q- {
# g4 R9 [6 ~; }: C" ]
.....  5 u0 h/ S9 O; W$ p+ K8 O

; L( o1 N. J. |0 @% zProperties sys = System.getProperties();  
: t1 Y( @1 ]; y5 y6 ], A( z' P/ I1 r& B1 _, O
sys.put("proxySet","true");  3 f1 X' |5 W4 i% @. e2 ^& I! C' K/ P

$ M* R" q, t  y$ j, @sys.put("proxyHost","myHTTP.proxyserver.com");  & W" k1 _0 Y  {9 O! |
0 |: |6 X# m) L$ Y* T% S* |1 P
sys.put("proxyPort","80");  9 J. d8 D' t8 t  b' t
+ v7 V$ G; O3 m, v% |
System.setProperties(sys);  ) K; i1 p& v6 V
; G( b% c6 p. O
/ f4 W% c7 A9 T/ P/ Q3 U; ?9 `+ @0 o' [

. _6 M$ E# Z* [; B1 K/ o# T* ]+ Wu = new URL(website);  
: L; R; N2 s7 ?0 q9 O6 l- U$ |7 x) x$ g) C3 w: G
connect = (HttpURLConnection)u.openConnection();  . z: N. j5 n+ K) ?, I
" ~; e  d9 v% l* g! K
.....  
  X$ A  ^% K4 ?) A: _) s% \$ e
! e% _+ p/ g+ \, ?% i8 k. ~  M/ g' F问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  0 E4 Y& k, D4 }, u
$ F, T% {* ^. X8 p
答:  
- W" `0 k1 [6 t: P6 j0 B! O, vJList组件有一个单独的显示模式ListModel来表示JList的显示数据.  
' N9 l1 e2 _6 P# H" g6 EJList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  
/ [% @2 ~+ L, h3 VJList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  , S" U5 m  H8 k
当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  # ~/ T0 n. @4 s% X. w0 u6 X

. a& ~1 W$ O- o( P4 v1 h问:  / W, h: Q1 W- n
在Java applet中如何实现一个模式对话框?  , B1 U8 P* U, X: G1 |$ [

: s6 r: E/ n2 z) S% w( B答:  1 D, R/ J% K* \9 a0 [
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  
! s7 [; ]6 h8 V: x! C
3 E: P* [4 g) c8 o7 H2 f! I6 E/ ]1 {
.....  
; V. [0 S( @  _% Q) P. N  G- q7 _: |5 N5 {: k* ^2 z
Dialog d = new Dialog( getParentWindow(comp),title);  
9 A$ g2 \6 Y! k5 X$ Z+ |  o; F/ _
, R- |5 x: i9 k! |7 N5 f// comp为applet上的任意一个组件  
! R6 s, R. P  \1 M/ Z$ u5 [, @* M; ~. a1 ?
....  0 s$ D2 p. B) z1 I% O' h

1 |! T: h" R; k# l; E& m
" ?  d! M5 ^: S' B( h9 C: F
0 \: M! @4 l! Z- z6 @/ Spublic void getParentWindow(Component compOnApplet,String title){  
. |* y8 m1 Q3 N0 \; p
8 b/ L$ W5 E- `5 E, JContainer c = compOnApplet.getParent();  & \- j8 I1 Z. N4 c2 C: o
0 v' k$ b2 Y  Q& c
while (c != null) {  
( q) }# P: @3 p! L  F( \. m+ \# K0 s# c( O  ^8 i7 E& y# d, G
if (c instanceof Frame)  4 k- [3 ~# Q! _

' i7 P  H% ~  ~( M0 \return (Frame) c;  
1 z( R. H% p! L* A5 e* X4 H  u8 b
, O) k( l- S9 g6 f( G) o$ H; `* ]$ Zc = c.getParent();  
: [* W, P. q  h* v. c7 C( J. `& z1 I% E" |/ [; M
}  % y, a$ _5 c/ D5 ^

+ Q4 r% \8 }& S8 ~return null;  6 k, S, R+ R+ `3 k/ ^/ p" ?

$ k6 [; [3 j% Q}  8 y- z4 e" N  f

+ {* A6 j" ^  ]) p$ I' U, F6 u- g问: 在Java applet中如何显示另外一个HTML页面?  , x2 T! ?8 J, r2 s0 c, M
! Q/ }1 Y$ O% n" X3 Y* K
答:  
4 V6 y& ]2 }1 g9 _; Y; u; A通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  
( N/ Y3 w6 I7 j# ~4 S# O) U7 K1 _# w
问:  
6 w  T# I, }+ F# A( i用JDK实现的签名applet,可否在Netscape或IE中运行?  
* ~1 {! T, d" K8 O* P- h  K; l( T" ]; B, V5 U" O, C+ r, b2 P# c0 V" q
答:  
3 _/ N" B3 u( G用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  
! [# y$ N, ?0 f2 N4 U( Y
7 a" _3 D# t2 W- S不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  : o; y$ B5 ]& e4 H& A

. G7 j1 @" y- X7 y$ M1 o如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  , h6 X7 e/ T! e5 w& K" a% |
$ Z& G1 z4 o4 K4 q/ ^5 D
问:  
; |% s- ~% _( K1 j( L2 `( |用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  
' r( {3 }; t+ j2 G: g
# S' l0 A4 H( z5 N* e  ?- ]答:  
) M$ L7 ?6 h$ z5 v& E5 E. k如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  & V* Z+ |3 @. d* h
编写调用C库的Java文件,并编译.  # j, d& R! T- F& g. A
javac java文件名  
  r) B, N) S# L; H' J9 A: [. f5 {( Z- z" E2 B8 ?

: O# n. r" e1 K产生C程序头文件  # F0 ]% s1 S, O! t
javah -jni java文件名(不带后缀.java)  
( Z% F& l- z& [5 v
0 X* r9 V3 V* u; ^0 }9 h6 S; \8 [, s) {
/ q' G# X) J& R" z3 [编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  
6 e; S! g4 p, h  Ecc -G -Iinclude路径名 C2.c -o libC2.so  
' T2 v( Q! `2 O( m0 Z+ Z; L1 e; Ucc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  8 M' s& C( _) ?) J. g! S0 n

: ?3 b  v  F7 r' M8 f
6 h& z, P+ `( F  @2 P' x设置环境变量  - C& N+ V2 u) t  G! e# m0 V% l
setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径    Y8 Z- L6 p1 K! r+ ^9 ~9 z
{LD_LIBRARY_PATH}  ) B) j! V9 O$ x' J" N1 i

) J! W; T  X% e( P
& B6 P: z/ P8 J9 I运行java应用  
8 J2 L- F: O8 Q: T! t# C3 L8 a6 g
' u. Q, R! \; f
问:    c! |/ Q, n6 }# ]. y
在Java语言中,如何列出PC机文件系统中的所有驱动器名?  
* k7 K6 p! D1 z' i, r( d
% r& x2 [, W+ L4 [- |答:  
1 G4 X7 K, |2 ^5 Y3 J8 F在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  
+ o. N: _' B" L$ z& a# n
0 x9 ^6 R# _# m( I; m; a问:  
5 l% V$ m3 n) r* K* ~为什么Runtime.exec("ls")没有任何输出?  / s* N9 ^! o4 y# o

  z& k% K" s8 Z- V7 d: q. p0 W( X答:  
" s' t7 E: Q" X% s/ P3 v1 N. {调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  1 Z4 y& b9 z8 I' ]' Q9 a
5 H2 P5 [4 M4 L! I. b; d

$ \4 ^2 ]9 Y8 S% Otry  
3 t3 l6 {0 [7 C& o
- V: d0 \: C+ T  B  q% D) T5 U{  9 G& b& R# n1 F1 D% G

$ z1 O- w6 |4 ?" z+ E" Tprocess = Runtime.getRuntime().exec (command);  
$ b. V7 L# r6 P0 ?  u) _, @) d2 r) e% R9 t. a% o
InputStreamReader ir=newInputStreamReader(process.getInputStream());  ' a0 p6 u$ G" O0 t" T# X4 @
' q8 g' U3 ^! q1 a+ S2 v7 _2 w0 ]
LineNumberReader input = new LineNumberReader (ir);  6 H6 i9 J: q5 ?1 b7 o; P! N

0 ^& n9 ?: g& f* [) d9 qString line;  
3 N9 v/ h8 @: V$ [" t
4 j! p; X0 r* p% W2 w+ cwhile ((line = input.readLine ()) != null)  
7 z* J3 J" p4 i
* L. k4 ^0 {7 j2 [; NSystem.out.println(line);  " A1 c" k# f( h8 g
$ ~8 J2 W% p9 d1 z9 ~, N( _, f
}  : q: z: V! O0 X6 w7 S

8 c/ v1 O6 N7 L$ X' W- zcatch (java.io.IOException e){  
( U( y4 ?8 w, H1 S: C
$ q' {, w1 j# }' H) JSystem.err.println ("IOException " + e.getMessage());  
! T  ~' ^: s# V/ V7 u
$ H/ F" J# U5 N}  + s6 A; W) `' Y4 t
. ]: `3 j: v' V" ?: Q

+ O6 C$ v5 g, k4 G问:  
9 H- |. ?( U0 f" r3 u& M如何产生签名applet,以使applet能够访问本地资源?  
& Q) D- `1 S% F% g, f. {& @% u9 i* X8 F& Q% I" N2 V0 D! V
答:  
+ W$ V( g6 W! L; M在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  
' \. h  \  d7 \! r
' i' h9 y, x! [% c) c4 Z, O% X1 h/ `3 A* s3 F
//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  + w$ y# i2 ?0 _$ e7 [

+ c3 \3 Q) _) K. I) T9 U. Akeytool -genkey -alias joe -keypass sign12 -keystore joestore  ) `# ?! e& v* a/ u& k9 \1 x
6 |0 C" K% F; e( g: [' _6 _
//将SignedApplet.class及相关文件打包成jar文件  
3 l5 }- |- c) q) h7 N1 ^. n2 D
1 C: g, J- \& |4 U* O( tjar cvf SignedAppletDemo.jar  ! R7 V0 u* `# P9 f' |
. E. j6 d- P) D6 ~
//利用keytool生成的自签名的证书产生签名applet(jar文件)  
; L6 @. P; L& [7 g$ @% Y# c  y5 e2 h6 x$ g
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  ( R# l8 r3 J& Z7 s( l& C/ j
; ]- ]+ a: X: z6 f+ H, S
//将自签名证书从keystore中输出到文件  
5 p% s  r  v: E% Z, p$ K
, f+ |* ]* A/ U0 Hkeytool -export -keystore joestore -alias joe -file joe.cer  
0 y, b  G) n  T, Q+ X3 `# f0 Z" C$ {2 O  f
  P2 O( X1 f8 W$ k0 _0 _% M
. P, I  t: Q6 D0 G# B4 p4 N
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  
( p6 U' d* l' H* @9 @" V1 ~* @6 M, B
Joe编写的签名applet:  
/ T5 @) I1 \, P" E
2 ?8 s  A5 b$ @//得到Joe的证书并将之读入到密钥库中susanstore中  2 T6 u2 a0 L2 P$ U: T6 R
6 @5 k, p3 i; W; N( Q
keytool -import -alias joe -file joe.cer -keystore susanstore  
/ T; a7 S4 i- ]
4 I- h- s! m" w. Y//运行policytool产生满足Susan要求的policy文件  8 s$ ?/ z2 \3 @" e" W
! @) {7 G, S4 S8 k! u7 [% u
policytool  # W) @: h: P0 o. `
# `/ `# J; F* E* L
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  % X, r; y# C6 }" c
1 _# b4 i  c9 q3 c5 W  X
) a* }. c* S. c$ ~* E/ o+ o8 S

1 D6 D8 j* c8 D/ n关于签名applet在Java Plugin中的部署请参考以下网页:  
) G* L6 Y1 q& f8 o7 F- g. Y
( T# _7 I- z9 G8 n( |; ^( yhttp://java.sun.com/security/signExample12/  # Z7 Q& W+ z, m1 d9 E9 u, G
! \& R/ p1 i' J

' x2 }9 `; M- o4 b+ D, V6 b4 w
5 e: _2 t% A4 {6 f5 _2 F; }注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  
6 }8 X  _, E) k% Y7 l2 l
" |8 G) e0 F" D1 [使用keytool -certreq向商业CA中心申请电子证书.  
( p" P+ j" s4 D$ r+ Y* b# f; B: D4 h& s

$ a! V+ P9 Y7 g0 o- |) c' u8 @" K- V2 a1 s8 }) x: ?1 l8 j- x
6 i  b" H8 s( @! b2 o5 q0 h: X
问:  
. F4 v+ Q8 p# J7 a# K( v1 K* D" M若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  / x. P5 C9 H/ I+ T
; R( }! N3 B: O. D% w! e8 t
答:  
1 y1 t/ B$ h" q. {使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  
3 b7 [# p- }& W9 C5 Q7 t- [" U4 X- ^4 w& D( O# t# U: U
问:  ( ^+ D1 v9 ~7 R# H2 w
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  
/ y; C9 K* X( ^  T! I- H
) }- t9 _3 I6 R+ a答:  
6 L9 M' W- M3 n目前,没有直接的方法可以将对象写入到随机存取文件中.  
0 ^( l4 E# l1 O, g但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  
* p$ |" C7 f2 H. w
& w  C' P/ }  ~! x& f' R" {6 A3 @问:  ' j, d; B0 [" e4 M6 I
运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  3 x% e% a& B5 O7 J, w7 R, m
  Y% @9 ~0 K. P& z/ N. e+ [; Y# q
答:  
0 j% f. t% r6 t% m9 L5 L可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  
( Q  x& m" K, D( ~0 K6 y1 p
' ], `' ^$ m' j* O5 I问:  
5 D# a. B8 I; P# i. }( f# |0 b, V% g使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  
& V- i+ @5 f0 a' j- x) {2 ^, F+ @8 D0 F" E  L3 e" u: C
答:  ; z; m' q. @! H* E
使用如下方法可以获得PrintJob的实例用于控制打印操作:  ; C/ ^: o  U, I2 w0 M  I! x4 D, \
7 [( X2 e$ v! q' ^5 h
5 E3 V: l9 n2 W! }: e  n* N. w! Z
Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  
2 P  i7 f, N4 h3 ^8 n/ d# g
/ m% ~" ?* G- u7 M8 {# p" o那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  # \. F( u3 u# t: ]
$ T! n% Y% b4 z! ^& C
awt.print.destination: 可以是"printer"或"file"  
4 ?- N8 E: r( U4 X: B4 ~6 ?  [# Q/ f& n  T
awt.print.printer: 打印机名  
+ s" T1 C9 Y7 X( H8 M4 I) ?2 }8 V/ M, T8 w, M6 N
awt.print.fileName: 打印文件名  ! d4 ?3 w1 U4 s, U
( z' q- x- g$ ]. z* R! O
awt.print.numCopies: 打印份数  5 \+ z- H( J) U! y6 ]4 H; g# `2 D

: z, o* u: d' d, E3 t6 S. \6 oawt.print.options: 打印命令的打印选项  
( I$ Z6 Y( E' _$ v/ a4 t
9 F" D; T; ^! n3 S7 Q' l* ]; e$ Wawt.print.orientation: 打印方向,可以是"portrait"或"landscape"  7 r! S  M! @$ M+ E0 C$ L4 w
/ k; p, @" p/ x$ Z
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  : ?- v' f0 k# I" g
6 B& }9 S! {. q* [0 I3 W- X
& M& @  k5 N' t; \3 a* m

' x% Z$ P" i- t4 S9 E
7 e, P+ d5 [' h) Z9 @( u
/ v6 E( V  N7 ~
  P- o* n. _) O问:  $ n- Q* s7 Z4 f$ n
在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  0 B* l, R! N- c; z

6 B8 U" z& W- l. y; q) u答:  / G4 k, @& d% _' M# o, o  Y2 b" R  u- e7 P
Thread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  
4 d' e2 j2 u0 D! x
" F# U! l- M4 t! _因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  % S5 b2 ~/ S! [) s  M5 @

' w; B. T  r' V$ T7 U6 e% H问:  0 L' F; B1 L& z! B( z: H
使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  
' ^" Y& G( z2 F. \! L  x& I# u7 n, ?3 u; p- n/ {) m: h7 W. ]
答:  % ~0 N' h) H  B, P* Y
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  , T( W7 k0 a' e* G* T
( n# t# X, o# y

* W0 R8 M3 `4 X3 [% O+ [ResultSet.first():将数据指针移到结果集的第一行  : u" p  K' N2 r

8 N0 r0 k# L+ Q+ S2 nResultSet.last(): 将数据指针移到结果集的最后一行  
! n9 G' @) n% P. Z4 W( y" _- p, s1 t/ L7 q  [6 U+ e2 q) L
ResultSet.previous(): 将数据指针上移一行  
  q+ T0 b6 X$ f( L& B8 N8 C. z( n6 n+ K( T% M
8 `  x! q& v, b6 q3 Q$ }/ O4 c
以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  6 S, z) X9 X. Y; F3 A9 s0 H
# R4 w( a, `/ [6 t5 r. X7 ?3 R% B3 G

0 n, l% u* @+ [, I' P问:  / D2 E' G* M( c7 `) B. i# W
哪几种Web Server支持Servlet?如何使IIS支持Servlet?  
  A6 \- [0 z6 C: ]6 R
* u1 f" }* M$ ^6 [" o& o' M+ K! d答:  
8 n+ d9 r6 H: I" }目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  
3 V1 o; {; |7 L- K8 I% F( B, A) e7 [3 K$ B. ?9 a
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  1 C) a8 V0 U& Z

* Q" `, X( ?, E) {, Y* Y* z8 C/ F问:  
$ C5 \, V8 T) @3 _5 m4 b* g8 T如何在Java应用中将图像存储到图像文件中?  
$ X! u1 j6 x% ?  \
0 `$ H6 _8 @: k- w7 T2 M答:  8 n  b3 i" k& Q/ X
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  
! c3 A8 q9 Y% X  a
+ x% f# A2 w% q+ a9 S1 T$ [& L. }$ A) y3 G9 F, D
OutputStream os = new FileOutputStream(fileToWriteTo);  9 c+ w5 t8 c) u6 Z* E

9 U& r' u3 g: p2 VBMPEncodeParam param = new BMPEncodeParam();  
+ \- ?  m  X% ?9 N$ L3 p1 ~% N& A4 O- T( m+ {7 V
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  ; J! ~' p( N/ X. E& b) g

8 V2 h4 y- O* ~' R) Z% _, o+ renc.encode(img);  
9 V. d: c$ l- ?7 B
& A0 x7 `' u+ L. Aos.close();  
+ ^9 h$ q$ C" g/ P" i; M. p/ E8 B* {, ?' p
有关存储图像文件的编程指南请参考以下网页:  - M# j5 |& j" O% `5 D  A
% E- @. P4 n/ Z3 l9 _
http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  
# T9 ?& M. }$ I( ], Q- B' ?- a& W: n- a, Z/ t3 T
2 g' l; M2 S% m" {; m' |& }3 V+ K  t! l
0 V/ t( H1 R4 H5 b

$ h* j& C: D0 o' E问:  * l+ j" x1 T& \: G& ]" s
如何用Java语言向串口读写数据? font>  
7 W9 o5 d0 n2 l( J
3 m8 ]5 @6 ~% \/ Z( h+ `答:  
+ G& u6 @" o0 q7 F! iSun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  * R5 C% O4 X' r$ i5 k
/ r/ W, X- r$ }, s8 A# K/ S
详细文档,请访问:<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-1-11 08:44 , Processed in 0.996418 second(s), 70 queries .

    回顶部