QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  ; z& ]9 E1 ?: B
+ N3 S8 j  z3 K0 N: X
答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  4 T. a* R4 `, y/ w& H
Java 2环境变量的设置如下例所示:  
) ^9 e7 [+ z0 J5 P: v5 qSolaris平台: setenv JAVA_HOME Java2的安装路径  4 D4 {5 ~/ Z' b
setenv PATH $JAVA_HOME/bin{PATH}  
, l3 T% T* j4 S- R; XWindows平台: set JAVA_HOME=Java2的安装路径  ) |6 [. {; F, d: j% K9 K
set PATH=$JAVA_HOMEbin;%PATH%  . ?! K2 g) y/ n
1 Y4 k' E- Y# x# R
问: 哪些Java集成开发工具支持Java 2?  # I$ P+ _0 }9 e: E
9 J" g$ N$ ?9 T0 I9 S2 x5 p
答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.  
: k6 w1 q, j. _- p- H( i
5 X( \( N4 X# G; I) Y8 c: y- }# d问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  
  H8 i5 b  d/ i" D# S, ~
: g0 \% J" t& ^0 O  ?: o答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  
; P  o$ w; W+ Q2 I6 _    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  
6 S6 o( M3 X# O/ o0 G% |) K    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  
% A- x! L2 _3 U
7 j, [2 y  i: Z! T. [0 i' g6 o# S问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  
6 |: h: K) J8 k. o8 g
2 o& r8 S: ?5 F% O答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  
* |5 S3 b; b% o" ~8 G- A, V3 F) J# k; [: [. Q' K+ p* ~
当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  1 X3 Y4 F+ \5 X. Z! |

4 a  E$ L: y4 G
5 a0 J. `  G0 P; P9 o8 LString native2Unicode(String s) {  / x. u/ C6 P5 g1 y* U, A
0 t3 @: }3 u- u( |" q% x
if (s == null || s.length() == 0) {  ! l2 f& ?" L; i! m

) [$ A: F' U9 b# h" v6 Qreturn null;  
3 k9 P8 }/ Q! N/ w* \. T) E2 F9 i/ q- I1 i* Q) }: w$ k  ^
}  
8 Q! d: b7 x1 V5 s- ?5 U9 B( m' Y5 e7 k9 V4 t
byte[] buffer = new byte[s.length()];    e. N* G: t( E4 [/ b, R

8 i5 H/ n" @8 S3 P5 ^3 W( {for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  % R( c, j2 A. Q  C3 X+ T

8 d8 Q9 W9 d" Y( N0 V9 z( L0 E" @3 ac = s.charAt(i);  - Y7 c! }9 O) f. G3 T

7 f; H6 x* ?+ D% ibyte []buf = (""+c).getBytes();  & I2 t2 W' \5 ]2 q7 _
# _3 B' |0 w. ^* s! W
buffer[j++] = (char)buf[0];  # g' z& d; Z# P1 ]  S2 ^/ U
( U& n1 p, O8 l) H
buffer[j++] = (char)buf[1];  ) w) S% s* q5 [) [+ z

. I/ k6 {) B! i$ d5 Z}  
$ n7 F5 e: E% q3 y" W# w6 E. L/ w' g2 }7 H
else {  
8 p' \7 K7 o8 b: h% {7 a# }) Q+ e
buffer[j++] = s.charAt(i);  
# j5 i1 M) P0 K7 O9 Q0 t2 X6 h7 V4 X5 ~3 B" l5 g5 [0 R
}  
1 C/ r) K1 x( M8 t, w
& X! c) j0 p- K2 |4 ?}  
3 q# h6 K+ B3 h' u4 u9 F2 Q
  A1 v# {/ k! V2 J8 E0 @return new String(buffer, 0, j);  
  L1 H) z, B4 v: \$ _1 K# L
" Z4 e) X* w  ?3 k$ H- y7 [) m$ ]}  
# f% [6 p$ U( D! @) k8 N) A% X
/ h+ {# M6 S$ Q0 o/ g& n除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  
. _5 R0 W6 e; ~; q! Y
, A1 Y' s; ^4 ?' n, s3 n! ?) c- ?  z/ r8 Z- \# v$ V
问:  $ A8 @4 y6 D/ o+ W5 x
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  
7 ?; S- J, q+ p  w& I' P! X- _( O# j# N. d; P2 a; {+ k
答:  : i0 d+ t* r9 ?7 [9 z. V/ ]& e! I  b- E
javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  ; z- D6 b* _4 q: V

0 m4 S7 W/ i1 |3 Q2 S7 z4 f7 u
. Y7 t" C/ H2 k$ ^public void doGet (HttpServletRequest req, HttpServletResponse res)  
: O* w0 ^$ {# }( r+ K9 y: i( N* g! N/ F6 a2 ?& z  W
throws ServletException, IOException  
1 n: G7 F( R$ w( L8 f4 L: p  ?" w4 M8 T. ?
{  : f. ?, f& z& z4 ~+ I( h8 Y/ s5 S8 t
7 Y1 Z. S, b9 [' x* A# x
res.setContentType("text/html");  
1 U+ Z. C! b; F: Q  c, u$ P0 S
& ]$ L% L5 X) o* ]: P- {% i  OServletOutputStream out = res.getOutputStream();  
7 w) w. C  `, f: J% ]
* r' a1 F0 q8 HOutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  & V8 v5 a+ Q+ O7 }$ o4 g7 w

  P/ D' {' t2 C& K3 ?ow.write("这是测试");  5 u! Z9 s7 n7 n* r, p, E# B
' m- {8 c9 m5 m9 D2 `# x$ _
ow.flush();  ; w% A1 ~9 u3 n! v4 v

/ j$ e. T: i* v( how.close();  , Y$ r. `1 A5 l* ^. {; E2 J0 U
( i+ F: w# l2 _/ Y7 V. q
}  & t: Z, Y- h% {# L

$ E8 V: V: k  {
! M9 e& d+ q9 |3 Q6 S: ]问:  
5 t! `" G4 u. T$ p如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  5 E" @9 e5 }8 l, V; J) Y! g( K
; k+ y  g5 B8 z" s! j
答:  ; H- N7 A7 l7 |; ]; w; ]" w
有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  1 w4 _+ g. t! \; L0 l9 j
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  
% N, [$ P1 j' V) C) W修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  ; K9 [- U; J5 J! `2 B$ V
# h8 v; O5 [8 }  Y, B

0 J% n" B6 t! X1 `  [2 J问:  
8 ?- G4 ?. ^* u# m+ \8 P1 b' d( M为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  / G. D& j! O' y" l/ B/ N# O
0 ^7 I/ B7 P( D3 ~
答:  ' J, O: I) Z8 N! n7 c' v; T
机器的网络设置不正确很可能会引起该问题的发生.  / o) A( o4 |4 r  I0 y
RMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  * X0 z! e* F* g
4 h, a0 j5 ?7 P" S6 y
如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  $ b/ [% c* |; l
9 b9 ~: Y# z$ w" D4 o9 R
IP地址 主机名  
6 y; \4 ^0 P! u7 ]- R6 O
8 n  {7 i5 d2 k( r$ \. x. D, c5 P6 |0 `如此设置应当可以明显地减少查询所花的时间.  
5 h: `2 a: q) ^& h# U) q
( y% s  s& W8 `, i6 z; _# a: P2 r( ?问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  
3 B' f' f* O  U. B) \1 l: m7 j* o9 @$ t1 ]/ E1 v
答:  # g# g0 [( ?4 V2 J: W+ c! E
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  
& I7 m/ v" z! o0 v# m4 x- D* j: N) W, F  w
; }) u2 `1 F5 t  j. z" B
import java.util.properties;  " g( n- ^/ w) H" M0 o: R
* R; L4 v2 N) Q" D# E7 H! m
.....  
$ t: B% E4 u1 a) T5 I% ?8 X) x9 D% L" h. e4 e4 o3 U( x
Properties sys = System.getProperties();  9 z* f" x9 r! v2 C0 Q

7 I/ E! z4 w' q% q2 }sys.put("proxySet","true");  $ h9 a8 U* s$ q& `
4 u. j. u0 ]/ J* v6 ~  y7 ~5 [
sys.put("proxyHost","myHTTP.proxyserver.com");  
, H' e5 _) R: z/ G: g3 B3 N* g
1 t8 `- r% e2 K9 z/ T% }4 L0 G$ s" wsys.put("proxyPort","80");  
. R' f, Y- X4 G1 g+ G
, _; k) w7 X) p( I2 l0 GSystem.setProperties(sys);  
. b2 l$ F; ~: L" D' ?
; ?* k7 _- m9 M" ~2 P( L5 u4 h% z& e- d0 p9 t4 ~9 z

6 q' S0 ~9 S9 Vu = new URL(website);  ; L' N* \( t& X8 m, ]! x# S

! P* F; k5 L" nconnect = (HttpURLConnection)u.openConnection();  
" I8 l9 M0 @! {9 U1 _
  n; ?( Z$ O! o.....  
! q& t5 A0 y# z* J. u- n
2 W3 S( Y0 F- w$ C" E3 k# c问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  % s1 x& B$ p0 W& ]$ q- t( L9 g
  o5 `2 H2 X# n& q6 X
答:  
  J! G; m: F( d9 O- Z7 @+ vJList组件有一个单独的显示模式ListModel来表示JList的显示数据.  - t. b8 w. i3 E3 t7 \! A
JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  4 I/ K# V6 p5 P
JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  
% g6 C: B0 S. Y当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  5 c0 H* e  r, x; V2 I$ O/ B. P
# w' p$ @  U! m8 a+ p7 x2 }& r4 Q5 @
问:  
, R1 h& x/ G5 P& r0 \* n4 ?在Java applet中如何实现一个模式对话框?  
9 T0 J1 g$ T1 i2 E5 U- z, ]
5 n: q# g0 W; S6 H" C答:  : X, x4 B' p6 w! j' {
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  1 X- G# S: q% v! A5 w- {

4 B* V6 Y# S0 w, e. i  D
+ C: O' I' n5 r0 a, g2 |! b$ Z.....  
5 t. \7 {9 {& l6 K  u4 _& o
8 M0 G, j7 i5 e9 [; RDialog d = new Dialog( getParentWindow(comp),title);  4 `/ E% z# w! ^* N# f) e4 C; i9 ]
. K2 R1 e6 {# T$ S
// comp为applet上的任意一个组件  
' E* L0 u3 w* u7 u3 _0 l! e
" g' @1 z$ `. I: Y  y" ^....  ; c2 a6 t; D8 K& d$ f0 N

5 v9 U6 `" w* J7 F' u4 g' W
& Z0 F# {# p4 u) H( r9 ^2 F0 ?0 _8 U. `/ i0 G3 q
public void getParentWindow(Component compOnApplet,String title){  % U) W% e3 F7 C/ G' t

* l6 `2 ~' j' R! w/ D% f! h* hContainer c = compOnApplet.getParent();  
' [, P( z0 ^% E$ s+ l- q4 \; K5 M) Z  t. a* _( Z
while (c != null) {  ) A/ O1 @# W- U6 e
9 W! Y. c, ^2 N
if (c instanceof Frame)  . u8 t- D# ~- k6 J3 e: L8 ^
. h6 G" m/ o- [" ^4 v" l1 T
return (Frame) c;  * T* I) |# _$ m* {1 a2 z$ Z( o
! w3 K# f/ T  O
c = c.getParent();  
! }  U2 P  \+ L( q0 s. R( O" X- M4 s
}  ( Q2 B5 d" i& g8 ^( m
9 U0 O; Y& ~& ~7 |: Z1 l3 v
return null;  8 q5 Z3 y( R& j3 f  D. T

/ o' b% L5 U' f. S}  
- d7 a5 f# t" l* m, ?+ j
9 J( U1 F' W. L4 X+ B0 t问: 在Java applet中如何显示另外一个HTML页面?  
# s1 p: L" [5 b. W5 \( K% @" U, K
. G( D; T3 Z/ \) G( f& Y/ f答:  0 `/ ]- ?& \5 L- o8 o
通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  : k4 ^- M! c/ [7 g& O

+ E# k# ?' K: {# d: e; P$ [% h问:  
  _3 l( c/ F: r% y0 @" V, M4 ^0 A1 O用JDK实现的签名applet,可否在Netscape或IE中运行?  
' k$ v+ j/ O) N; S# k7 a6 e$ d+ @$ n8 R0 n2 @* \
答:  
- F  d$ n' Q9 W! V用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  / G  \& D: Y8 C  I( n8 k

  ~2 o* w: A# h# S: r1 _- b不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  
8 g0 G4 L( S5 Q7 T" s( n4 F
; B& ]- l/ ?7 L# m3 {6 q如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  
+ |2 J3 Y+ S* ?: _6 p2 v5 \
/ @& Z8 G, t9 e4 W9 x( j/ ?" z9 [问:  6 i- V: u, J/ F) f1 w# R
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  
) j5 ~* M2 W8 x5 ]4 F1 T, x
8 ?' l$ u, O* O答:  
6 A* X& w) M% L2 T: e4 b2 R如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  
8 P; s& N, I9 F5 ]0 D编写调用C库的Java文件,并编译.  
6 O, Y+ ?1 v& e: F  Njavac java文件名  5 |5 ^  @$ {: B. j
. |- y2 u1 {" T- r+ C$ d
5 c, F; z8 c' f+ ~
产生C程序头文件  
* r. B& @- {! u8 S. [javah -jni java文件名(不带后缀.java)  
4 H: T' \7 d( ^3 ]
: \' z/ {$ D+ @, w+ K7 q8 S: j1 T
编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  
  q4 |7 r9 {* B, xcc -G -Iinclude路径名 C2.c -o libC2.so  
, @* y2 E; F8 ecc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  
+ o% e+ w/ ?# j+ l  T6 H5 j% q! C$ q* C$ q, m) i) B

" f1 R6 l- M! F* i) t2 B设置环境变量  3 @6 T+ Z5 L: c3 k" [" P
setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径  
$ J' c+ Z/ X+ h' Z  y{LD_LIBRARY_PATH}  % V9 m* X$ g0 D+ a1 n) m" {2 f

) p0 [  Q; m$ O& t+ L3 G" m  V+ x$ V
5 p1 ~: i6 |+ Z4 S  m运行java应用  
8 r9 }0 e8 y5 S( O2 U; b% `. _) D+ L: D. Q
5 J- v1 h' ?) d' [4 G: r
问:  
* h4 ^( K0 e4 n6 @1 W在Java语言中,如何列出PC机文件系统中的所有驱动器名?  " J% U8 [9 d" [

6 ~$ }+ K6 M% h+ @# _2 C! H答:  # I# |5 _: x7 o+ z1 ^
在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  
1 C8 ~5 \7 U1 V( B7 P; @
9 }& B; p7 e1 q1 p- z' |6 E问:  
7 V: h" {  ^- I( u; X5 G为什么Runtime.exec("ls")没有任何输出?  ' v8 t. {; w$ N( T

5 e( J% o! }& X. p% K; q6 b答:  
+ b7 X2 E+ R* k# @4 _* P调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  . P( g3 J+ I. V& B2 L

- T; T) `- ?$ `6 R/ c% S! B" e$ s' q" b
try  
) N# F, @, {/ m! C& V/ f4 U# f6 s. e5 E+ m1 x0 P3 f! z' ^: S7 A; a
{  
9 S. r' a) s0 C9 q6 F0 U5 i4 m% O
* i; v. \0 p2 o$ t+ g2 {5 @process = Runtime.getRuntime().exec (command);  
: c' U. C, m1 Y  f3 G4 B% {
7 Z$ l8 v( k: |, z2 V2 mInputStreamReader ir=newInputStreamReader(process.getInputStream());  
! y: z( y! J* A( J: R- s2 g
1 V0 Y' |& E1 f/ a. S! }LineNumberReader input = new LineNumberReader (ir);  5 g; O+ |3 E6 s" N/ `4 }* s. ?6 t

& {2 `0 m+ ~9 hString line;  
2 j: [" L% i# P- E: e
3 `( P( I) J0 W# u- P* o; d3 \while ((line = input.readLine ()) != null)  
7 ^! H( O9 K4 [! Y8 {/ |) G5 n6 x! s
System.out.println(line);  
4 n$ L1 p- c; Y* Y- S+ x+ U* }: s' e* v. }/ W
}  % G  f1 t1 v0 E% R1 T" S

. Z/ i# C) [4 }, [3 v' P1 C) Ocatch (java.io.IOException e){  ( f5 G+ D9 g6 @0 \# J7 b0 c

4 C5 ?0 f8 ^9 ^: ^System.err.println ("IOException " + e.getMessage());  ! u  [+ l1 U( O: \1 w

% |# p" x: g/ k: E+ ^# R, |: Q) `}  ( Y% O  u  }# S: U8 V* V

7 z1 B+ o* W- l
# j3 t# O' ^" K9 D$ d问:  - }" t6 u3 A' l: B" P5 T
如何产生签名applet,以使applet能够访问本地资源?  : \. i" o$ e5 }- v6 ^
( V" X' W# {; o
答:  
, M; p  Q* O8 U" S在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:  
8 n9 y$ y. z! k. `3 n3 l3 Z3 w
5 m! t1 e/ @/ {+ j. ^0 m7 d- V
5 T/ V# t3 f( J  [1 b9 a- y//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  
* i, G9 d! F: J5 f5 Q5 a# h" h* ~% r' i3 p0 ~" _/ c/ a
keytool -genkey -alias joe -keypass sign12 -keystore joestore  / J7 w/ |' D8 `9 ?7 @' W* e0 x0 r8 g* L
) d: e% A$ R$ j
//将SignedApplet.class及相关文件打包成jar文件  ; P% [5 W& w, h6 ?6 ~

: F- G# Y0 N+ ]( X5 G1 R* d0 Tjar cvf SignedAppletDemo.jar  
) m% N0 z3 o& @9 u: J2 ]1 k3 w" J$ Z+ @5 ]6 S
//利用keytool生成的自签名的证书产生签名applet(jar文件)  
1 B# m6 V/ T9 j% L
+ m/ R% S5 M9 d+ {+ }4 vjarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  
: I3 [2 M; A& x' }7 |. _# l1 F
' N  B( n3 a9 k% {" Z5 y//将自签名证书从keystore中输出到文件  - w! T5 h% n1 {% D2 e) j5 |
& c2 @' M+ s3 D+ e) N+ Y  b- ~
keytool -export -keystore joestore -alias joe -file joe.cer  
0 c7 c& n% b) f% p* A# c& o# \8 Z) V
$ s7 n  r4 Z0 c- _# V$ [
  o5 C2 x2 B. M
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  
4 i+ L4 T8 d% W7 g% |0 V: U. `8 O: S7 n+ s
Joe编写的签名applet:  
# C9 b+ r, m, [) |/ I; O5 V0 `0 f3 r% Y% m/ j% m4 W2 h1 ~
//得到Joe的证书并将之读入到密钥库中susanstore中  , ~' J9 r. z! l/ M
! W+ x1 z& N: Q4 M. w! ~5 Z
keytool -import -alias joe -file joe.cer -keystore susanstore  
. A! L# m9 `8 x# y6 Y+ y6 D0 v& e* O4 S4 f
//运行policytool产生满足Susan要求的policy文件  3 x( w0 }1 c# s3 ]5 `
& F4 l' W' G3 `( \9 n9 N9 G
policytool  
+ R8 S9 V% P# D4 p. S' D% B% V4 g; A+ p+ ^( }0 l2 @; o
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  * @6 t4 o7 i; h

0 V% g9 {. e: l* H9 f, r, c3 C
* p6 U% T: e. K0 p) \3 P: }4 p. p6 d$ t/ W8 x) V- p
关于签名applet在Java Plugin中的部署请参考以下网页:  + s( Q3 M7 G8 h- t2 k  y/ S
; t! K: s0 y& r. i# F% n
http://java.sun.com/security/signExample12/  
% |1 ]" q( S* `8 q' I  `7 t: X( X+ J+ Y. O( i

; T5 b6 ]/ @, e/ Y( s% R- x5 {; N9 ]- w" k2 @
注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  
+ f' k3 F, S6 ^6 V6 M0 n6 x; {
$ ~6 M5 Y6 i" o8 T! n$ Z: M; Y使用keytool -certreq向商业CA中心申请电子证书.  2 C, f0 h& t2 c

# x, H, p- `! j  p8 z; D2 t1 S* n5 C$ J" ^" z1 ?0 P: B

0 ?# }4 k& {: ^# [5 M) @# u( y( w, U* k3 g. k
问:  - M' s4 U/ {& @# E
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  
6 o# T7 D- W7 |& }
  T8 n9 B* w: u* p. H$ P答:  
+ d. \! f# c/ u) m3 P; R% x使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  9 o" i' E# G1 T2 J0 b# M

, C- w; H, v7 v7 u9 q  e  @问:  2 l& B% H3 I6 G/ ?/ M  m6 ?6 m
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  - T( E, N1 u7 t$ @5 W
6 L  i5 ~* F2 m% ~8 a
答:  ; U& j, h; O$ e4 q
目前,没有直接的方法可以将对象写入到随机存取文件中.  
$ Y' l5 O& U/ @' w, ?+ {但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  
/ n7 t2 O% F7 Q, x" {/ g6 y
3 @& B  w4 `3 F' }' K! l' v问:  
/ B% r6 Y' m0 k+ {/ K2 R' y, g运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  & O9 q5 h* C) N( k! G

4 v+ b+ p; V9 c9 e答:  1 O8 q* I. d5 p$ z4 Y4 Z: x  v8 P1 W8 L
可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  9 B2 \  P! S3 r3 |

8 ~% r5 R/ w6 T问:  . V" M# O$ s; {& d
使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  
0 K0 J4 c7 u' o9 H, U% ~; w
% }4 N' _9 D# N- P& j答:  
; k' K6 A8 b% x' |& P# F使用如下方法可以获得PrintJob的实例用于控制打印操作:  
: M6 x# [  r" F) S7 B& d% C  P
" X) H7 ^4 k3 a. y1 C
& x$ A9 j! E, x, Y3 V- t3 Y0 K( [Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  
2 W: }  J9 o2 B7 p/ j8 }+ d3 a. I+ B, H6 g4 H& S
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  
8 c+ X+ ~  L0 s9 `' C: w2 b% |
1 M/ ~8 F) ~: n5 M" N- _5 ~9 Nawt.print.destination: 可以是"printer"或"file"    C2 c3 y1 c. O

( l2 Y/ Q2 J' b) Y3 gawt.print.printer: 打印机名  / }" N' k( D. K

3 u) I* d) S# B+ P; Lawt.print.fileName: 打印文件名  ) c0 M( \9 |  I7 q) j; I" t1 B
5 q9 Y0 f' _# @! G/ g% ]! q1 b! C
awt.print.numCopies: 打印份数  - I  S' f0 H6 e1 I. H* Y! c/ |
6 Y# D3 S7 m: V" l
awt.print.options: 打印命令的打印选项  
4 C8 d9 {# \, T& m3 d1 Z, \3 |/ e3 p8 n: v4 i1 D! s
awt.print.orientation: 打印方向,可以是"portrait"或"landscape"  # t+ X9 O8 S2 B5 v4 ?6 O! p2 B
# G2 q8 l4 m2 Q! o3 H" d* {3 ^
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  
* \# T8 `7 L  w/ ?- z
" o) F: t7 d8 b8 ]+ Z9 i+ I9 ^9 \2 r* i% f" t

1 q3 r4 S# p4 B: `) J: W& C. y
! S- G5 Y" N* d8 r
3 g, f, u) [( J$ e* w3 o* i6 u2 R* l4 a6 e3 |& U9 v' G0 \
问:  $ q  T4 h+ v  d0 C
在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  1 p8 G$ O) x# d& ~* T2 T0 N
! i6 E  K. ?2 f7 a
答:  
; |- R) \$ j7 WThread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  3 L4 i/ L1 i! g" H* ?9 v+ b9 W2 h
* D0 H2 _* P. }
因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  , @( w, t7 Z3 Q- y; j$ ?9 k6 N
6 K  t, _" m% j# s0 M9 S: Q
问:  
+ R3 F: A; F/ e4 }+ R使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  & g( A0 g* \$ \# }3 r1 v

! Z0 |6 w: J* L  w0 u: z3 E% L答:  3 g+ c2 C2 Z* ]+ u  [& `
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  - o4 r( w0 [1 ?! A6 e1 W

/ J; _. i6 g; C, B
" ]+ F/ U1 ~" b& U  iResultSet.first():将数据指针移到结果集的第一行  " `* p1 i; e8 Q
2 _2 ^  i0 q/ ^
ResultSet.last(): 将数据指针移到结果集的最后一行  
" D7 ]3 e4 {( L  d2 D  e9 m) a( p9 _1 h) A4 J# |. }/ G/ T
ResultSet.previous(): 将数据指针上移一行  7 N( M* `* M1 z# y* ]* b
' R* o! W+ H1 K' A( ~5 O2 M

9 i% r/ T; d# `以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  1 n3 k$ @( m0 K* v0 A/ |

/ B0 l, C9 i8 C9 ^
/ _& Q% @9 m6 e# R/ S0 n- a问:  : }2 X+ g0 s" h3 g8 V% I- F
哪几种Web Server支持Servlet?如何使IIS支持Servlet?  . X3 f% e- l7 V; H
: z/ }) |& w, s0 l  ^# h
答:  $ H& b% @; h" R' ^. }
目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  
2 K9 `) m! X6 s( j* }5 D
& n* q+ |: M* S$ X此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  
# T9 d6 o; J* R2 D$ ]. _. P. {3 o
  m' h# C" t# a0 c5 R" {( Q) L2 c4 K问:  
9 R8 {, x1 [5 D( G, p, U如何在Java应用中将图像存储到图像文件中?  4 V4 [+ l% P& q" p) i: H$ R

3 Y# R. b& s% X3 K答:  
& b6 d0 z- O6 _2 w( V8 v. JJava Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  " C: Y* r+ w, p' j  ^
, O. H5 e9 p) `6 f

, g" d& q) v4 ~+ m; [# }# fOutputStream os = new FileOutputStream(fileToWriteTo);  
" E& d$ e* {3 I! H% t* u0 _  z/ u: i/ ?7 X3 f
BMPEncodeParam param = new BMPEncodeParam();  0 ^( y5 x( e' \

6 M/ m1 S. c3 p& M: a' u+ QImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  9 Z6 k! d/ J: t3 M

: o: @4 I- S$ D! Q. Ienc.encode(img);  0 c& }) ?7 g' j

1 B& V+ J; e$ Kos.close();  5 d: y' R* s; R! E1 V- h( b

5 L" o& T) e  B. V有关存储图像文件的编程指南请参考以下网页:  
! L0 C/ m* ~# S# x) W, g- P* _' M3 Q8 T& q' `. i
http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  
+ F3 z2 S# s) U
' a2 `; A* c9 `5 x/ z1 y
+ F; _2 ]/ Z5 Y3 t4 ?/ |( a! t  z- f! K& q+ F1 x8 U

* K* A/ Z8 f1 M- N: P5 I+ G8 f问:  , l: v0 z7 r2 x9 I; T" P5 m" L
如何用Java语言向串口读写数据? font>  
, f, o1 i  a3 j7 {4 G8 g9 D. H8 \% C
答:  7 u, N3 Z7 J2 e7 ~" V1 T
Sun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  
9 m0 K9 i$ n8 O7 C8 G- V
, `" F8 [4 v6 [- ?; R/ C( O详细文档,请访问:<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 13:33 , Processed in 0.516604 second(s), 69 queries .

    回顶部