QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  - w8 g- g1 }) z. A+ P; o

- S9 m: j9 R1 s4 G5 L8 p答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  2 O, D: Z/ Q* N
Java 2环境变量的设置如下例所示:  8 j  k) K7 {* `2 b5 d! S: [; V
Solaris平台: setenv JAVA_HOME Java2的安装路径  
% O6 R6 o* f7 |+ B; y6 N$ ysetenv PATH $JAVA_HOME/bin{PATH}  
2 B- g0 y: Y2 F! }Windows平台: set JAVA_HOME=Java2的安装路径  
% R8 p$ Q% x) F: e$ ^set PATH=$JAVA_HOMEbin;%PATH%  6 ^6 T: \8 f7 J; `. @- l
3 b* B3 r$ Q% G4 |& P6 r1 l/ w# E
问: 哪些Java集成开发工具支持Java 2?  3 I  n( i, w2 J4 y" K
" t/ e4 r& }, Z) }
答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  
" p, E% l+ r! U7 c1 @  Y
4 I# q- G% }( V: N4 e2 Q& j$ w/ u问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  4 R0 k0 F5 n0 i) z  n" W3 }: A* M* q

* M  j9 ~% i+ L4 z+ k5 [1 V7 W答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  
1 w1 D; u& \# G    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  
' v* }$ l; v5 |) S, y. v    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  
+ e6 h# q( y4 Z0 i1 |0 V
, c- d( z  V; ]5 w2 D1 Q9 r$ j问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  4 ^+ H* s+ o: b/ n: K! S

" N6 s  x$ y; p) _. l+ u答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  
' N; c9 t/ O+ K4 Q5 a" i# |
9 I# c: L4 D9 D9 i2 ?当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  1 R# ^  u7 T8 N3 W$ _, S
+ |+ b( U* g- _9 W3 S6 y! A

4 d, p; I: x/ |& G+ }) `' wString native2Unicode(String s) {  
+ |9 l4 P0 q* P  q  P8 l1 Y" r2 o% U* W
if (s == null || s.length() == 0) {  3 H( V. r+ v) {4 r) w, U! e& _  V3 _

4 e/ ^3 W( T. h' W' g7 x4 ireturn null;  
8 {5 ?! ^' O0 Z' |1 k) `6 c, x) n& v
}  
, N/ u0 B. f7 w+ {7 K2 k% [; D, t& a  f6 |6 }2 d" R9 z
byte[] buffer = new byte[s.length()];  
& T/ L1 b8 P3 w
. _" _* P2 w( x& Mfor (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  . P7 J( ?4 t! |
/ O5 z: _! V; O, T
c = s.charAt(i);  6 J: x  B/ R! W; j1 ?; \

( C7 _- \: g4 ^0 t) j/ @0 r' e: pbyte []buf = (""+c).getBytes();  " ~6 A+ C+ N  }' P
3 x7 a; Y9 t$ ?/ B$ e& j/ q
buffer[j++] = (char)buf[0];  9 l+ R# [7 V# t7 ]9 b! J& ~0 \  K

5 j& G" r* @( n4 B2 Qbuffer[j++] = (char)buf[1];  
% k& ?3 O9 y9 C4 D& r3 Y+ N1 E) X
3 R8 W7 T6 O' V: e1 }8 ~: r: L- k}  
7 m$ w, d+ {5 J0 `! z
2 \2 D* I" E3 e+ z; Belse {  % T7 ~( }9 L! N6 W+ ^2 Z

) c3 ~- j1 q6 \buffer[j++] = s.charAt(i);  % I7 D( G; P" Z- O2 K

2 h" g3 z+ |8 D}  
' {4 B& S6 Y+ {
- T: ]4 ^+ d3 p, k}  " f  J7 Y, }4 d

! q& \3 u$ V0 h' r9 K( T* ?$ a0 Creturn new String(buffer, 0, j);  & O2 ^1 X" v7 J
! v* b& T  [$ N7 v& ~
}  
6 G7 s3 }3 K3 ]7 O! E1 F" c5 C1 l* D
除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  % ^$ K: Z. y0 A' ]& D+ T( a1 `

3 p6 s7 U* u3 ?: Z
; Q, [( h# P& n2 n* x4 Y问:  
: o# y, r1 _& K当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  , Y- P8 v9 ^4 A
' `; A- X# r1 t$ l5 Q8 r% Z4 n
答:  
# @, m0 H2 M9 y8 w9 Qjavax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  
" e1 A1 g4 ^! ]. v- Y
8 A( t3 ?: @4 {+ c& u$ V  Y+ L* u, H5 z2 t5 S$ u
public void doGet (HttpServletRequest req, HttpServletResponse res)  ( T' {' Y1 d# f

" A/ z& p- u. T& y- [( B; fthrows ServletException, IOException  ; S( A; D- R, \3 ?8 N6 S

8 N: U4 C" i8 K' @4 _8 r8 i$ o{  ( y- _/ Y# z# J/ ~% D" M1 c

+ q+ \" v4 E# N# `2 K# U& i9 `res.setContentType("text/html");  
: ?( r4 G) n) ]8 ?1 I: U" v  i
9 p7 q" ?6 z  G2 @' t4 _ServletOutputStream out = res.getOutputStream();  2 R5 t* v9 V/ K4 S

# c# a1 u' v% x+ a2 s0 I1 g5 cOutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  8 [2 e5 L+ o7 L6 F8 l9 |( G7 k

" U8 S& r5 `2 Now.write("这是测试");  + Q5 t4 j5 Q( _) E; F- X/ Q
- P3 O8 S, E- T0 x( e! V- x6 Z
ow.flush();  # Z' X5 e1 _4 l# l

# p, z3 N/ A0 A$ {6 Sow.close();  
- N+ ^  X& `" P% |+ V9 L
9 ]% R" _, E3 K  f" [# ^1 O! W}  
0 q2 g9 b' i+ `
4 Q. d5 m4 ~5 \( I
( E% w5 j$ P& Y% O  G9 j' S: B, f问:  4 R  @" p9 P, K; J
如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  
' ?9 R, ?+ {# H6 f0 c1 m0 `1 [$ A0 t+ w
答:  
% M0 v+ H. _' R4 P( S有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  + L1 ~& s0 u- e; s
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  - F$ F$ I% T2 `$ G1 v: n; O; z
修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  * _  p8 v+ ]9 R" R+ `7 Y2 i
2 l! _2 Y9 a. F: A% K# n9 k! j1 @

9 C9 }! e7 X# I1 [  C  P问:  $ o# g9 \3 L$ Y% o% a4 }
为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  / Q, J' d7 K+ }

, ~: |/ X$ ~% B: ]答:  . h& C" j) [. g6 }6 b
机器的网络设置不正确很可能会引起该问题的发生.  
$ H& a& q4 ~/ ~5 X$ ~# T' hRMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  2 M0 o; }" \; s1 E

% t" N* C$ B4 f+ m/ R8 N如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  
1 v$ p, L$ e, n. _7 z" t9 c1 Z$ b# I( c' w' }
IP地址 主机名  - T, L  r4 F1 ?1 e  ^* j0 w
$ R+ Y- @3 q; U/ K) w  r
如此设置应当可以明显地减少查询所花的时间.  
4 X8 x9 _5 _9 v" }; q
. c, ^' H# `1 S问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  . n7 x4 ?) l' [9 n# `: U' ]6 }& ~

+ L' v. e% g; t0 n) G, \0 n答:  , z# m0 r3 ^6 G( k) H
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  
4 O9 g- c) G- h" ?6 w3 }8 a# W' c! `* |: I

' v1 z; Z2 A. dimport java.util.properties;  : Y% ~7 G6 w* e, O/ x

. N) C* T; B' e. c.....  " G$ S6 n) ?* U

2 X( }( [: a( o5 q' |Properties sys = System.getProperties();  
) e+ m6 U0 h1 ]3 `: u0 z. d* S$ N' t  Z' ?
sys.put("proxySet","true");  : L0 D; v6 l0 }8 f7 r8 r2 c+ B2 {0 d
7 d$ x$ G5 }3 N1 D
sys.put("proxyHost","myHTTP.proxyserver.com");  : {+ P# T" f/ b+ Y5 x* G' q

9 c( h' R  j5 O" z* \sys.put("proxyPort","80");  
# Y- R: D) N( d* Z
& I5 w$ Y! B0 \9 t6 D8 ~9 b% M$ Y, ~System.setProperties(sys);  : t$ ?5 |6 ^2 H/ c, |' z, V; y$ P

4 T: P9 `) }8 c9 }! i# ~* r1 s, p( [: D" p) I5 S% u# G5 s
6 u# h" V3 N5 s+ j
u = new URL(website);  * u! B1 x8 K+ M
! `2 y  u/ D" i2 |
connect = (HttpURLConnection)u.openConnection();  8 d1 ]- @( p6 C! H7 r& S& J
. H) X! t& c9 Y: m
.....  : l$ l1 E6 K, m: {
. p9 p* w" ^: b* M/ y
问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  ( }! ?; U" ]0 }- u0 z& h) H

) g+ i9 X. M' H8 h答:  0 h; z& _5 B# s' z( {) Y+ |; y
JList组件有一个单独的显示模式ListModel来表示JList的显示数据.    Y9 {0 Y, e; D1 t- N  t
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  
* N7 V3 v+ v" S- i2 ?, TJList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  
7 K0 v; S4 Z& c5 E: Y当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  , N# {5 d( b; s% s3 \6 e9 N
5 W* B* }8 Z3 k  r$ |& |
问:  
, K" k. z+ r& e2 a在Java applet中如何实现一个模式对话框?  # `3 g/ S* a7 G; {; {/ Q
0 @) n2 X. k1 {/ N8 _
答:  1 w4 z: E) H, A& q6 e9 G; J6 _) ~
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  * ^5 V2 Z$ j  L( [4 i4 s

" A- |0 N* ^) J( S! h( E: [6 X% a0 q( P" V; H0 m
.....  
* z2 s! j; z5 @9 e' S5 p$ I+ i* N* Y( P4 D2 q) d
Dialog d = new Dialog( getParentWindow(comp),title);  
0 D* \- l2 w) p7 a; w, Z. V% s/ E' Q, P& H4 d/ i* L
// comp为applet上的任意一个组件  7 |4 h: n% G' E) `) t1 y

# ^' Q' {% D- }, {....  $ N3 K% I* x" X& |

" J4 Z; X+ N* c
  [+ O  H2 L8 G' Z9 \
, g3 b( \/ G5 O, s9 g8 ppublic void getParentWindow(Component compOnApplet,String title){  
0 }+ {# E+ x. L6 X! x
( b& m. s/ h* }$ wContainer c = compOnApplet.getParent();  
' k( k: z7 y0 j$ Q. T8 k6 y6 e0 _4 }. C! ~7 H
while (c != null) {  
! o' L. S# v1 W. E# e$ I
9 d- A) u/ @! j5 ^& }- Z5 M0 Gif (c instanceof Frame)  2 a! i1 |$ Q+ |9 |/ ?
0 @1 C( |$ h( C# r7 Q' L( o
return (Frame) c;  
4 v) E2 V/ P" z
; p8 p: C1 ]( h& [. j% Uc = c.getParent();  
8 a* H* b' l! {$ [" ^3 ~2 c& ~* n$ L% P! r- q
}  3 }. {% \" y1 W( F& \
! l$ d' P6 k* l# O1 @) ~
return null;  4 t* F: i* o+ z; `4 q1 `2 Z

+ f* ]! O# S( ]% b}  
) X  ]7 U  s/ L" t8 V$ [
! i& q, h9 O6 y5 r' [问: 在Java applet中如何显示另外一个HTML页面?  / G6 a. j& J; r* k

7 V: x- N5 P" B% i- d/ H0 V$ m- t' m$ ?答:  
' s% \3 `1 n9 Z& n通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  
( e/ ^& _/ `& T6 {/ N8 q1 I7 Z+ E# i$ Y3 U, n. t: C
问:  & K8 Y- |( E; Y# ?( [  o
用JDK实现的签名applet,可否在Netscape或IE中运行?  , ]2 w+ [) b6 W9 o

$ j- ?! J% y: ^答:  3 s5 J! T/ y" C8 @3 g
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  
) Q* x$ K. v2 U0 l: A5 e" N! M' \: ^+ p; @  D* o2 S
不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  ; j+ o  L5 a6 L3 }6 ?& R2 u. M

6 P/ a$ X% t, L3 u+ Q: C- l如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  2 U# A# w9 c% Y1 K7 @( b

2 ?' L9 d% j- y问:  
' `# E: K9 {9 ^2 ^, G. H, H2 x8 ]用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  
6 E! C  j! m- B2 K/ D( }' Z3 |2 b! s
$ i" \0 v* k! f* r. ^2 m% Y# j2 W答:  ( Q  T  D6 e4 `( p
如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  - d' J: x/ Z4 M; u  n9 H( r9 |
编写调用C库的Java文件,并编译.  
: y6 R( U1 J7 Njavac java文件名  / Y& q7 c4 q: r. g$ N$ I3 N

+ \& k: A# N6 |- T' n
8 q  R* a+ Q- E3 D: `' o. X) e产生C程序头文件  
8 T1 o2 }9 |0 D3 |( l' P$ ?javah -jni java文件名(不带后缀.java)  
1 j1 z! C  h3 B5 Q0 C* d7 {- C! h" B. R3 K: d- z7 L) @+ Y$ j

0 [8 g( I6 B( G+ Y7 B: X* @% G编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  
' \- m" X. d/ u! U1 Vcc -G -Iinclude路径名 C2.c -o libC2.so  . ^! U: j$ Q$ ~! J! a" A
cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  5 u( U" Q& `7 U9 y0 L) V" q: q# B
9 O; h0 k0 B; |* B' C  y8 p
0 g5 o7 S+ s# z, b. N
设置环境变量  . f5 w4 z% B" v6 e; L# \
setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  
+ j3 l0 s- h/ _) ~; _  Z4 D{LD_LIBRARY_PATH}  3 p/ p  z: z! \0 A" O4 _

) P, \# \% L. @2 y: K/ f% j. ^) G0 {; ]1 k; s5 Q# c
运行java应用  
2 \( |9 ?: V; f- @" x4 K, q6 v
; e( w- @$ N+ B( R, T
+ u- Y2 d" ~2 E% k/ L问:  
# i* W5 w# f  e- w# S/ ?# T# R在Java语言中,如何列出PC机文件系统中的所有驱动器名?  $ k2 G2 X; O' u1 t* f  R
3 p) Y, V$ l  P8 L! E2 k
答:    X! }6 Y" }6 O
在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  , f3 X  Z; N/ K+ G, X( ?$ `

* d3 y9 z( G; ]1 e& n* f! E2 g, _问:  
. [6 W  K: O. O; x( o0 y/ @为什么Runtime.exec("ls")没有任何输出?  
* |1 `0 {- H7 i3 _
) Y. Q( y7 e0 k4 P6 F答:  
/ L+ j3 z$ I" O& B! F( g5 _( ~调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  - j7 e) Q9 F1 }9 l# X

8 U* R  f3 @" S& f) o9 t/ {
# J: m. Y! p: u' Btry  
3 y& Z$ v4 G- L4 Q
5 @0 X- Q7 C, }1 Q$ C8 I{  
7 ^# X- w* p- Q) j( l! C& ]3 d- A
- D2 n. e. A2 G- ?9 }process = Runtime.getRuntime().exec (command);  # n% T2 y- n; ~- z8 n2 [1 Q

7 U" o* |# k# r( h2 k  n4 C+ rInputStreamReader ir=newInputStreamReader(process.getInputStream());  7 ?+ B* r8 s& ~& D  n

9 A6 m5 g! t/ s$ [! i3 E" q1 ?  _LineNumberReader input = new LineNumberReader (ir);  
) g0 p- H( Q( l3 [1 f/ B, _5 s7 ^% a8 T7 J7 i2 k
String line;  
5 O; ]% `& u* y' Y" ]6 P7 e; L" o4 c* v/ P4 T1 f5 U8 R+ O, u9 Q
while ((line = input.readLine ()) != null)  
  a$ {" c& Z  @3 g0 C0 @8 W) m  j) H& y4 }4 j! M
System.out.println(line);  
* \' M* p( N" G: P6 T7 u1 G0 A
; |+ c0 I9 W" T8 L}  
9 f% O( Q$ G2 b" t4 G0 V
% j! W, F# Z0 |' A7 g& ?catch (java.io.IOException e){  ( e9 M( Y$ ^; H. C9 f+ a' Z

  C* ?7 J) `. HSystem.err.println ("IOException " + e.getMessage());  
9 ]6 }4 }/ w0 j* A2 Q4 a( t4 r8 P  H( C+ t+ o
}  " B6 @' t; u, [. {, Z

( ^+ o: w4 x/ _# s# o
. f1 `) K- S& z, J% w5 Y问:  2 e6 M  s% r6 k; h7 j0 ~9 V& i1 L
如何产生签名applet,以使applet能够访问本地资源?  
, L% l$ T. r1 x+ i, N
% A2 [* T; T2 ^* _$ Z" B. M答:  4 C$ W6 g8 k4 E$ z8 K* l1 O
在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  
! e% m5 _) x$ I- q! y; y+ X0 c  o! b4 g, C. P; ?$ |; I

- n+ \& n& U/ |+ e, h//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  
( y9 P; t: {( n4 _# O6 n9 x* `
# k6 D4 J# Z( t' Ckeytool -genkey -alias joe -keypass sign12 -keystore joestore  - B! b, h0 R4 ]

1 ?7 f, J9 b% B+ p) n//将SignedApplet.class及相关文件打包成jar文件  
2 v" N) \8 R4 n; {* `: m5 a( P6 |8 Y& ]$ T2 }. b* d! h( j
jar cvf SignedAppletDemo.jar  
5 @( _5 J+ U# k9 w; @) y5 w. j0 Q
//利用keytool生成的自签名的证书产生签名applet(jar文件)  ) [, H! r" @2 {# z8 q$ d

# w2 g/ b8 E2 t1 fjarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  
5 m- N/ q& `* b$ C: z) }$ J' i9 _1 ]: h0 R
//将自签名证书从keystore中输出到文件  
( W- ^0 z/ ~0 O# V& L7 T5 N' x2 Q& ]3 h
keytool -export -keystore joestore -alias joe -file joe.cer  9 O. P1 y9 Q% h6 f. f

" D9 b# R  v7 j) ~! H: t
* f7 H9 x3 a0 x) c. q" i) \; V% j5 W! y0 k, K# U
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  0 R  c4 K# M" z7 h$ _- k( u

: w, p* M  v6 M& }! l0 X1 T! sJoe编写的签名applet:  
. j) q2 s0 C3 e" @$ A7 f) Z; S& L$ u. W) U) ~% Y: a% L% e
//得到Joe的证书并将之读入到密钥库中susanstore中  
( p& z6 C/ u/ X. q  H7 B" K& d! z! M& y
keytool -import -alias joe -file joe.cer -keystore susanstore  
+ j$ E0 U9 S( P# F7 v; V' Q% Y0 {, z
//运行policytool产生满足Susan要求的policy文件  & T9 J9 V) i; P0 X+ t2 a" e) N, u2 Z) U
* z" k( Q: T3 q0 h3 R
policytool  
/ n4 [/ m4 |6 q9 [4 _
% k( o: E+ u! g* z! j9 C3 b//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  ; h3 ^, s1 M6 _! N+ }. `

& }9 _" |1 A3 k: Y' J7 ?! d. j6 u  S; d* L7 G( H+ `
! B8 }, d0 v7 n. }( E4 a: `
关于签名applet在Java Plugin中的部署请参考以下网页:  ( T: e/ t" s5 q: ]5 g. B; e: Z

+ b6 Y0 h# W" i& W0 q4 yhttp://java.sun.com/security/signExample12/  ' L8 z' y9 w! g% `2 K9 K

: x4 K7 h& h0 m2 @( R- [7 b1 H8 G9 g7 G5 e% j3 g: S. i2 M
9 {& k% [) |& J6 v
注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  ! G; z% q! r" X  h

" v% N# P, e7 \使用keytool -certreq向商业CA中心申请电子证书.  ( b& p2 G! A$ b1 e

/ _; m' C! D, N8 p& ]# u* d) l& L
7 [" v8 J; M8 G" h! ~# r9 V: [! B9 d( _5 o; f) z, p8 S
) ^. h* y$ a" E6 M  X1 s
问:  
% [5 h7 V$ @( s$ I' y( i, S5 g若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  % Y* n. W. d6 t/ s) ~
& P& v# e0 z- z! z; q
答:  
6 ?. V5 v  ^$ i: K; L* f使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  
1 ~4 c  M' C8 v; p; c
6 |- y% p- O. J, M* ?2 Q. Y问:  : ^/ W6 H# A+ f
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  
5 m/ M$ B+ x  S6 B; O
: S1 g( }- ]! T+ H) R) C1 e答:  8 I0 a7 ]4 l; M: W- W
目前,没有直接的方法可以将对象写入到随机存取文件中.  
( a( z. ]/ \0 a0 E) V但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  , H' F) X$ Q. i8 s

+ N9 s5 c8 i2 w4 g, \4 R问:  5 m4 S) l% t' ^* g  k$ J1 o; F
运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  4 I* `; C5 g* s& @! ?9 d5 `: I
' P/ e7 C. V$ c
答:  2 @& E: T7 N/ N; r# h
可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  , r9 R7 y% o6 \( u3 y9 w" H4 ~
3 z" `1 [+ N* c+ k5 o
问:  $ ?4 a" w  f" u% V" J
使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  ; x% I7 H) @$ J4 l5 n* x
9 ~' c& U; c. o' L* k) b+ u% J
答:  0 J5 z% C" w9 i* V0 \2 q; y5 z: l
使用如下方法可以获得PrintJob的实例用于控制打印操作:  
3 y4 v/ i7 x7 ^' B# z) g9 {9 ?' T- L7 ^

/ W' b! Y2 b+ R, d( UToolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  
. B" L; \" o. @( P$ U( x
& {( k2 P) g' q, E7 K3 U那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  + G( H  r( m2 ]5 e# f+ g
: D1 G0 Z% j( b0 [, l
awt.print.destination: 可以是"printer"或"file"  " g! `7 A/ T  I) d

- U3 k% M* [! Y% k; m- {! Cawt.print.printer: 打印机名  & P' Q6 Z: X; ^4 `

5 t7 Q, k: y) H& n! X' oawt.print.fileName: 打印文件名  
2 w$ v8 j( V3 G+ k5 I2 H8 o
! }+ V$ }) k, v/ Rawt.print.numCopies: 打印份数  
  t0 M' d' T1 C: A5 V1 s! Z
9 E4 s+ |2 A$ D7 l- n$ t% K- H" Fawt.print.options: 打印命令的打印选项  
$ Z' g7 j8 V  C6 z& Y' a; z/ s: Y
: a- r: [5 Y* @# \7 w$ d" D, R. uawt.print.orientation: 打印方向,可以是"portrait"或"landscape"  
! e1 y, Y' i% x- T, X) X1 ^+ Z$ B6 D9 m% k' u
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  - |' Y0 y1 Z. a4 n# i
2 y! t) _0 p9 g7 D
! ]3 X' C2 R9 U9 v7 I

9 F) F" A# t: i9 G8 x! `5 v
. F# F9 g$ @8 z$ U- l3 Z- j. b  f( y+ A

# R5 X7 _& x/ a" Z问:  
! q( w; Y: X+ e2 `$ ^4 b在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  5 ~6 a4 X9 @3 \) P% [7 @' O% I5 q
) R  @1 ~5 a9 L  J
答:  
- w6 T9 H  P8 J% H2 UThread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  
$ n0 n& \/ L. n. `6 f
) G/ e0 }; a( x( {! D1 p因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  
- h0 ?. q( v/ d
  O7 Q% r1 Q6 H; I$ r% C问:  
0 r$ d$ {7 y* e( S使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  
$ }4 Y. K) i! {. M9 ^" S  k# L4 H
+ h$ Z* Z4 |" s: H* o1 j答:  
% J2 o, k' |+ G1 i, \. g# F% T在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  
" X! h6 H) b+ W2 o$ b! Y- q; H7 B
' P/ ~7 ~0 r$ v- e( ~8 J8 c! u8 h+ H0 @
ResultSet.first():将数据指针移到结果集的第一行  
5 E# N" P5 c9 O1 E' D+ p0 L' v/ W
ResultSet.last(): 将数据指针移到结果集的最后一行  
9 t1 H/ S( ~3 Q
6 Z' r# v  T& p% C% uResultSet.previous(): 将数据指针上移一行  / R+ k& I1 l0 ^! `8 d% z- k* d' B
4 @% y# Y0 x7 Y+ d7 _+ E
" Z: @3 {" T0 J' m0 g+ v
以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  - n! z/ E: I4 j+ c9 N
. O) q( @7 B8 j0 v6 R* M9 k2 q

( X* T; d: N+ e# o$ i0 Q问:  : P" c- Q' O! O; u
哪几种Web Server支持Servlet?如何使IIS支持Servlet?  
0 C: v" g' Y* `( m; d+ N
$ ^7 _. Z$ |; A答:  
2 T) j& X( ]; }6 n  S# z6 @目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  
& I! y/ j  d. {) P/ e% s& A/ U( }+ |! ?0 m& {
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  ; {6 m; {# p" k& R; ]3 }

. y6 A7 F) e: N' _; L问:  
4 ]% x  K9 C4 ^- c: w, V, g1 Z如何在Java应用中将图像存储到图像文件中?  
# H4 ?* F3 I0 m& D" ^2 |! _/ L. H& P1 g4 s, p: d0 T9 M
答:  
2 d6 p% B' R2 E: [- e; IJava Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  
+ l$ V' E- J0 X0 [' T; N) p/ ]2 b) [3 [5 R
- T- e; e; h/ @8 P  I# D9 z1 S
OutputStream os = new FileOutputStream(fileToWriteTo);  ) Y1 r6 p: e  {; I8 G4 Y
) h$ F! i, o9 o* n: K% d1 T
BMPEncodeParam param = new BMPEncodeParam();  1 O$ l9 E6 b6 `: t$ D

$ m5 U2 p! I" u; hImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  
" j2 F4 ]" F& B
0 u& `; q* H/ U1 Oenc.encode(img);  % t, r: B! I6 A6 b
  }0 h! ~- X6 @- h; m$ ?* @7 Y6 s! g
os.close();  $ S! Y  Q9 l2 {, j& Q4 X

7 r5 \) I" d4 A# T# {! y% w有关存储图像文件的编程指南请参考以下网页:  8 x* L/ ]) y' t- W, M  m
/ {/ y! E. E" d
http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  
! C8 Y9 i0 M- Y/ |* L& V4 ^! G- v) F. H$ ~- ~7 |& G

' g+ V( ^- u' ~; o  {" h# A& f/ ?9 V1 I) i

& {, Z7 Y6 w' Z2 C: m问:  % w! \6 e6 d- [
如何用Java语言向串口读写数据? font>  
/ v3 \# k- ^: p2 m% p2 \  l( C5 \' ~* o- m
答:  
' f/ A. @3 ?( i4 \/ USun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  
' J# \" z2 q4 k
0 X/ j" \2 f" p4 G  |! X详细文档,请访问:<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! 代码

    新人进步奖

    回复

    使用道具 举报

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

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-11-1 03:43 , Processed in 0.430261 second(s), 69 queries .

    回顶部