- 在线时间
- 0 小时
- 最后登录
- 2007-11-12
- 注册时间
- 2004-12-24
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 2467 点
- 威望
- 0 点
- 阅读权限
- 50
- 积分
- 882
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 205
- 主题
- 206
- 精华
- 2
- 分享
- 0
- 好友
- 0
升级   70.5% 该用户从未签到
 |
问: 如何设置Java 2(JDK1.2)的环境变量? + H4 E! h6 u t% ?& ?# D L0 G/ b
/ g. ~5 s; Q5 _2 h: U, j答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径. 4 m6 a" e2 d( s
Java 2环境变量的设置如下例所示:
! X! v, R7 a* m2 gSolaris平台: setenv JAVA_HOME Java2的安装路径 & u" g B+ T7 I9 d* D
setenv PATH $JAVA_HOME/bin {PATH} , W$ W. y5 e( D4 `) x3 E: \: Z" S
Windows平台: set JAVA_HOME=Java2的安装路径 / ?2 E/ V' I* `# o v [
set PATH=$JAVA_HOMEbin;%PATH% , ^' v& }5 J0 O& A5 J3 B5 z; F
- z+ G. R1 z% q3 n& X5 d问: 哪些Java集成开发工具支持Java 2?
0 a2 i0 Y6 G& q3 f, g$ p
4 s0 [: I8 \5 A+ d+ m答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.
1 e9 ^% ^9 j- F; [, ^' d+ U( R0 D# ]7 F
问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?
. g+ v" l( ^9 C% \+ O* a8 d
9 s7 S5 m( q+ Y% V答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关. : u* c2 Y+ L/ s/ X. }
如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin. 6 K+ ^# ~0 ], |/ H' f
如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序. ) r Z$ p& z5 S% [! a+ M% p
8 \4 ~! p+ r5 n! z- b+ e+ e/ i问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码? 7 ~5 t8 m+ _& ~+ u7 w4 W Z
4 w3 F0 G( r* }3 M+ _ l' ~答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.
& Z! B% @1 X5 {0 y% B- C x( D7 b' y2 a) B/ y! \$ e. |: V
当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现: 5 F# Z6 ?8 M6 ^
1 ~ x0 H( b5 Y' ]% N
& }" N" H- u% M1 t" d" FString native2Unicode(String s) { 0 c0 _- O2 |% a" m# e* o
5 A4 v* m* Z! F$ r) m
if (s == null || s.length() == 0) { 5 v2 O% }' U# D$ e. k
2 A# |% V5 H) l2 [3 o
return null; % L* Y' L1 n( \2 M2 L. @
; S3 ^1 _* t( O6 X$ j# u# Y9 l
} ' V& r# g9 i) q/ q8 A
0 ^& ]- h( n0 s1 d" d, Mbyte[] buffer = new byte[s.length()];
; J, |: `! x' n* p f: f5 @0 `0 g' u4 M* g5 c5 f
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) { : K9 S9 Q0 B; r- Y
6 Q x) p, N# [6 x$ W
c = s.charAt(i); ) r/ ?1 k+ k! V6 l8 x& S4 F) Z
, {: s0 P) F# | y% h% T
byte []buf = (""+c).getBytes(); $ L4 Q) L( E" U/ }& K2 S' z
4 T8 E8 T6 U8 x) {/ E; j1 ?1 x% E) ~
buffer[j++] = (char)buf[0];
6 Y8 R% Z+ i/ ]1 i) i: T* L, w% u# a
buffer[j++] = (char)buf[1]; * ^5 U7 F6 n# Y! h8 y4 ^1 W+ h
! U6 g/ d$ b* R8 L% ^} - v# J2 Z7 o1 i3 c; O
% _( x6 I5 i/ a! ^else {
* z* _$ F, Z0 e4 X" g1 H' I/ L: H! F. R/ D
buffer[j++] = s.charAt(i);
+ E* N0 }9 Z# I; ^
* k9 D( O. F! x" v- A} ' k5 N5 H1 C0 r- }3 ?4 @# l
; t) [& @( O# V; n4 [1 ~
}
8 B4 @( S' D3 k% J+ K3 e B4 ^
7 I( b0 n0 n/ P$ `( A' Qreturn new String(buffer, 0, j);
- r2 t) |1 i0 Q7 d6 Q d- Z- A+ ]6 x" v5 B: C. ]6 R
}
: J; m: H4 E y7 S# E& F
, t6 Q. G" w5 `; e+ a2 h: p9 \- p除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了. ; u0 z5 ~7 O* Q5 U1 ?; W
0 h3 o& x8 f, ]* k1 }$ c1 y- E
0 e( m3 T$ }: M- T' A问: ! s2 l7 D2 a6 z. ]& n
当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?
- H: ]' G% k5 I k& ^" x2 K/ E% X3 f0 u- D1 B
答:
+ s/ F/ U8 D9 S( ^3 yjavax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下: 1 ]; M) L5 j5 }1 W S5 j
: L* x8 W# h1 Y
o4 J0 X6 S0 w: t$ Z+ D# V lpublic void doGet (HttpServletRequest req, HttpServletResponse res)
- C0 K, g1 `- m: R7 J& m
8 ~* {% J" \# m# F7 Sthrows ServletException, IOException / e2 h- m% a6 X! X9 p! w( n/ J
" Z0 P- S& J! [3 l: M2 n5 w{ % J+ w& W1 W% K+ H7 ]8 u
, d+ z" W8 x3 z& Eres.setContentType("text/html");
3 u7 E+ P, l$ P3 p" R/ v: {, p% J Q. z, i' R
ServletOutputStream out = res.getOutputStream();
5 Z5 P4 [" E! C3 L' b% t
9 `# A. |/ N! m1 t. i& @" pOutputStreamWriter ow = new OutputStreamWriter(out,"GB2312"); . } l' ?" `3 m
- m$ @% o( `+ \1 l7 U
ow.write("这是测试"); ' ?2 o4 b/ C: I$ Y0 ?+ [
, B# q! x! d1 }2 e2 Cow.flush();
' N I# J# D6 j7 s& b/ Q! w/ W5 u+ i7 F0 T
ow.close();
& J5 ?" B4 Q; X) T: B2 Q4 k
9 v+ k+ b' @/ g/ E9 l; u$ \6 d} + {, d, H, o0 M, ~
! W. s- B( \1 x q+ u
1 P; O0 a7 o8 Q* b8 n
问: - h9 \; ~7 ]+ W& C6 ?9 q1 q. W
如何设置Java WebServer的CLASSPATH,以包含用户的class文件?
0 F p$ T: k7 n. w* G& s; u* M" ?7 o" I
/ G& G) F$ \9 b( x1 d+ C答:
2 z- Q# G1 G# w8 z有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件. : J, I6 D, N4 ?( J, k7 D; B
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.
" S$ P7 u) t+ z3 K K5 V3 {修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中. ' D. Y) `# _" M6 M# s, y* t
8 K' r5 B1 I. K% o, ^7 [' }
6 u0 e' U* e+ Z问: : b) H1 u3 U6 Y1 e- t
为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?
% i5 Q2 K! a+ |
6 }5 L1 Y. h2 ]6 Z; E) r5 v) j3 G' a, ^答:
9 Z. s B O) h& r8 z g; p机器的网络设置不正确很可能会引起该问题的发生.
9 r1 u: N. M2 u7 ]. qRMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中. 1 F& O6 b+ @5 i8 t6 ?* g \1 H
. Q* V- s& [- K
如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:
3 k7 b! D7 |/ r# ?; U0 x
6 p# t/ f. v2 l2 O+ bIP地址 主机名
! G/ n2 j" D( \( A2 Z6 b" x' j" C, E6 V$ u
如此设置应当可以明显地减少查询所花的时间. 5 o, j/ G. {% G5 C9 ^
6 S- J/ \8 {/ J( N$ _, z2 q& r$ T问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?
5 ^* H6 D- ]5 K$ B
0 ?* L- o" ^# L: L: {# v! b答: 2 x8 y# o5 N- A; F( N
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:
. p$ H/ l" [* t; h- p m( |( v, K' { R; F2 F' I) a
H1 l$ ~) I1 X1 C) D1 Timport java.util.properties; $ t3 V( U- s- z( _6 z
* l' b" D$ a1 B) n..... / q* i" T7 u# u) f2 i
) B* }8 Z$ S- C: e
Properties sys = System.getProperties();
; A, I- c+ N& j2 k" p
/ T: |( g! `+ o {9 \6 t8 U& N# `0 Csys.put("proxySet","true"); * ~& {; g' }- s9 v2 D# J' h' b
0 ~3 d/ q+ g" d& N: Ssys.put("proxyHost","myHTTP.proxyserver.com");
, } z ]/ Q, F/ \# ]6 e" s; y
) q# H4 [) L, k/ R g0 |sys.put("proxyPort","80"); 2 H, u& m& m. u. g1 H7 R
; r) L; @- r# r9 e, y, C8 LSystem.setProperties(sys); , P6 }2 r9 W+ q
8 [' F, r: G/ w. `* t+ ~- g
0 Q8 S" p/ G/ M( K" d+ ~ g
4 I9 v* K( c# B2 ^8 V6 e& w$ ju = new URL(website); ( j/ Z1 m0 u* G6 m
1 g+ d9 m# E/ h/ W. \0 b
connect = (HttpURLConnection)u.openConnection();
5 z% D% ^4 N) `1 ], [8 K- J9 S, B, b
..... / _) P- H/ X7 k8 n
5 S) ` G! A; {
问: Swing组件JList的列表数据修改了,如何通知JList改变显示? 6 Q! q4 u( t- n9 g0 V
1 ?% f, S4 S/ X4 l- `! O& }答:
& G" S& @+ |8 H, g6 J* y5 hJList组件有一个单独的显示模式ListModel来表示JList的显示数据.
: ]4 m* F/ o% wJList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.
4 a8 O% G- m' A9 k3 ?& w- BJList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.
7 N- Z1 e# E& B& x% D当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变. 0 d$ I" W, D' b" B9 `6 j2 S
N6 e& E* l9 t, `; S6 m问: ! g2 D- }+ d# K8 ^+ @
在Java applet中如何实现一个模式对话框? % ^0 }2 [ s+ _
( |4 e8 J& E) S: K! d, I( G! o答: 6 W* Z7 i5 e% _$ o' `
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:
# `3 w$ X/ x5 i/ T* f7 u5 A5 {/ t/ V# u1 B1 L* y! N/ C
3 \- f* U# C$ L* y
.....
, Y3 t+ f/ j& P9 V
% a4 Y, A, i& @. A$ I8 O7 w; uDialog d = new Dialog( getParentWindow(comp),title);
2 Y J4 V( J0 s0 A8 @ }
+ \/ q# b3 ?8 T// comp为applet上的任意一个组件 ( {) T* O6 O! ~% B9 w
4 |) i+ W) ^# j( L- h- F( W5 {
....
$ f* N; l4 w5 u7 Q8 z i1 S7 l- N8 J" Z2 j% \1 m( n
% K& w" t8 J% L& N$ J* I, [9 t
" I6 Q' x c' b/ K# W) u2 [4 Kpublic void getParentWindow(Component compOnApplet,String title){
7 N$ t5 K! m' Q$ Q( a6 x
2 v& c S, e. v+ qContainer c = compOnApplet.getParent();
0 D7 f6 _. C# \9 H! `+ q
$ m; Q: Q$ @. K* f# U8 rwhile (c != null) {
* X" O( k' T% M7 _3 ^9 }( X2 k, P! G& l X# U# Q& R
if (c instanceof Frame)
9 |0 T* v1 s: v. z$ X6 q( I( v# {( E, U1 \9 Y
return (Frame) c;
8 U/ J( X* {, G5 U
( c5 z- G8 Q: v8 _. `( j+ R( T3 Pc = c.getParent();
* G) P5 A8 `/ X9 \4 Y1 h O* j, ~( |# V* E" K/ c3 h' z- {, ^
} # g/ |& e" ~# T; W3 A% ?7 r+ S
, S* V# Z/ d4 l7 k0 \9 F& m: ]" k
return null; % m0 {& K: Y+ e# h( f# J
+ K3 `) w, N; ^( s7 O0 n# |}
0 n- `0 A2 u' p- s1 C
3 y& a4 y$ Q# F- W! d问: 在Java applet中如何显示另外一个HTML页面? 0 D% V" z9 F# Z( k; {
* F! a$ E1 r# a
答: 9 v! @0 e9 }1 q% k h( O
通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页. 3 o% A9 M; h% z# A# E. U ~. x
2 h4 [. @, X% F1 m& Y
问:
. G4 L- T; L, L7 c6 P& P9 n% W用JDK实现的签名applet,可否在Netscape或IE中运行?
/ E) r, l% b5 A" g" }
& I& {8 A9 B0 e. D8 Q& u答: # y) T2 E+ `7 w. K' H9 I
用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.
, r/ z$ o+ h0 ?3 [2 ]2 u* Y' n9 W6 x0 b% R8 U3 F5 j0 x
不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.
* s" D" G3 R+ T1 @. H, s' I& c b' G7 a+ P& j( z6 m
如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.
% z, _. ~4 }' K9 }+ z+ J4 M
# J6 ~% ?" o- s问: - k5 G2 Y. m+ `4 b& u% P
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库? " U, L& f; @1 v: ~7 |1 E$ S
2 d9 Z! a) g8 E4 w+ n/ v! O
答: - q2 p; a3 f$ Z& @
如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):
/ K% ^9 ?5 A/ ~9 D编写调用C库的Java文件,并编译.
Z; m+ n& Q, P8 R* W9 sjavac java文件名 , x3 W* D ~2 I* o9 L. o4 _
6 L4 _3 R) l: }1 S$ n9 ?: x! z
- w1 T: |: H1 T# s% ]1 z, x产生C程序头文件
2 }: y* N" y9 t7 {* r5 ]javah -jni java文件名(不带后缀.java)
7 X4 I% M1 I8 s5 R
+ \0 C& g4 p1 K( K0 Y0 i, F# _5 O2 c$ _+ f
编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译. 1 a. ?. [& @3 q/ R) S) R" A% F
cc -G -Iinclude路径名 C2.c -o libC2.so
9 r5 J" \: v! J( G: X; c) {cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so
; n! i/ I' y' q% o$ t* w
! \7 W9 T7 I' K* q* N8 I0 W3 T9 e4 M3 U, F8 I
设置环境变量
9 m G" @' U$ M% qsetenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径
- S) r: I0 o' J- b0 B, S {LD_LIBRARY_PATH}
6 T# A6 g# W# i$ X6 z5 I& x; L
# e3 L4 I2 @* r7 X8 [
0 R- c* P7 H8 ?/ L: X5 |, k% A运行java应用
0 M& u2 X$ h7 U( u7 H1 G$ j. J3 \5 j3 I% @
. D+ s7 R+ O9 Y4 X问: ( |& N6 B+ F! y1 J( }/ R
在Java语言中,如何列出PC机文件系统中的所有驱动器名? . u; l3 P% ?1 ~
% A: A' U: q$ o# \5 F8 H: b# L答:
( q( M0 @6 m( t K2 |在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能. 1 z' P+ }2 C1 y$ C' A! y
& I/ L4 m0 K5 x; q
问:
5 q3 ^; p5 Q, c% v8 ?7 b- P为什么Runtime.exec("ls")没有任何输出?
' E$ A$ e v% ?
s3 y, k) P/ l+ v9 F3 a答: , k* E1 t( o2 j+ E( \
调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:
" |. w: @4 j: ]% P# n% |# x' s
4 f( l- i: V5 W( l& d) J9 K
: T: b2 r0 A B$ v3 V1 @3 z! Qtry : ?- \7 |2 M3 V
- M% e6 Z3 w4 @2 }3 l{ 5 N" L, V5 T# Z
/ U, S9 I& e+ ~4 p3 a; Y
process = Runtime.getRuntime().exec (command);
" Z# h* A" I( ~! O+ q% m* X% m6 H* J
InputStreamReader ir=newInputStreamReader(process.getInputStream());
. i$ O5 U" S' w" t# Q/ q# U& W2 v& ^9 e' y
LineNumberReader input = new LineNumberReader (ir); # r* N7 M7 h! |3 I
! O; W8 m( p; A" r% I0 }8 P! jString line;
t2 u' F8 d, o6 n# v
6 }, N- i# v7 rwhile ((line = input.readLine ()) != null) ) }( |* B* a3 _* d3 k
+ i2 x7 e2 g* v, p0 DSystem.out.println(line);
+ p0 P" A! U! n( ^$ c/ J7 h( ?* a0 K
} & y6 |# R% ]9 {" L
% v6 l* V' z; N! @9 E% r/ j+ _catch (java.io.IOException e){
6 ]. Q7 x1 O0 f( \) {/ R) |9 p
! Y) t9 @, E$ L1 G9 TSystem.err.println ("IOException " + e.getMessage());
% E, `2 f: s5 g8 P0 J
0 H1 D6 r3 H. Q& r- C! ^5 M}
4 ~9 v) |$ E7 Q9 T* ]5 @
: J A) I+ R+ a" h$ x) D( g& W* S/ o6 C3 e" J, r- j, ]( V4 W, R
问: 1 V# m8 @3 [1 x2 Q+ k
如何产生签名applet,以使applet能够访问本地资源?
% s- f, a4 Q* c9 m+ ?: m4 Z4 l' D
答: 9 {1 `' o7 f: e
在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下: . }6 z D+ e5 A: f% \9 x
. u- v6 Z7 c* m* Q# X; D; Q4 a5 R. [4 [6 z" o
//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中 ! o+ b4 `" w2 E; k+ h7 B. c2 P
- G% w$ `# Q# |, T( o2 Rkeytool -genkey -alias joe -keypass sign12 -keystore joestore % E! `, J/ {* Z+ V* t: ^
, a* Q W5 G! P0 W% L4 V: R* U* ?//将SignedApplet.class及相关文件打包成jar文件
7 S: Q3 T. q4 I0 O! o8 V( F
5 [. Q# T2 ]' d6 n: l. ojar cvf SignedAppletDemo.jar 8 c0 G/ O; w5 X# R+ R, O2 t- V# V1 n
2 u" L) C( O( \3 N+ y//利用keytool生成的自签名的证书产生签名applet(jar文件) 7 B& {3 l7 B7 u/ k6 D
2 L+ ~4 J3 z- c# m7 Z6 d+ s
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe / L4 A# \ I" P
/ }3 v( |+ y X' J0 Y A t: R
//将自签名证书从keystore中输出到文件
3 t/ {- I6 a# ]# ?/ L6 E1 I- S. c; f3 q' ^
keytool -export -keystore joestore -alias joe -file joe.cer
2 {2 k3 o6 |, @7 D' k1 S& D B! u+ c) ]. b5 h. a2 D9 @) N
: _, K0 Z1 X1 a! o
2 s+ D3 K5 T9 b( { ?* _2 N而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行
; C8 m% v+ o ]; _& c( C' x4 b4 u; J: L7 }$ V$ ?
Joe编写的签名applet: ( p& U; z, l6 H" D6 m8 K
. A; H, G* ^- H9 R' }$ T//得到Joe的证书并将之读入到密钥库中susanstore中 6 P! Q7 \' W0 U+ c$ u; p
8 z; i' o3 J3 y C! J. n7 g
keytool -import -alias joe -file joe.cer -keystore susanstore
3 k# }( I, v2 e$ ~ U# _+ K
& {% p0 u- ]- p- w, P//运行policytool产生满足Susan要求的policy文件
6 i6 E. v' D6 j1 F! p6 ^9 G `) I& M( S7 p' p0 w! A
policytool 0 k- ] b, Q. H! F
7 w, Z. j* m3 F" i, }8 j6 v
//用appletviewer运行之,或在浏览器中安装java plugin来运行之. 7 @9 j7 k: ]: d3 q6 Q/ I
( u# ?; @* {# Y8 N; x2 J+ o" U# K3 P2 p. i( s5 r. U
# j5 u& \; b9 q- @' |& H+ p2 ]' j% x关于签名applet在Java Plugin中的部署请参考以下网页: 0 w' D2 O& I" W N* _6 C
) |/ _6 H1 M& I, a( g3 o# N
http://java.sun.com/security/signExample12/ 0 y5 ~1 L1 o1 Z+ q/ n
- F! z5 X Q) y" \4 X1 y! w9 q
+ D5 R$ _ ^& r3 \ \4 J注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以
6 G2 c+ y- L/ ?
. I- a& }. g5 O/ W9 Z Q: s3 N( ^使用keytool -certreq向商业CA中心申请电子证书.
3 u- e! x2 v- g0 H: V
7 R4 R4 l2 M' N
& I# e; i9 B( r2 D9 Z6 n1 B; y; G5 V6 F
. i) |# i3 L0 H( a* i, ?& X
问:
% D7 z3 O$ k: }6 v+ S% ?& O若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
- ~$ t9 U2 E n; @. j0 L' L# [5 N% N ^, G2 K1 `3 N8 }
答: ( d! J' t/ M l5 |
使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.
' @; _3 c) O7 b- N9 \: b1 I$ z, ^: Z$ y; c2 m
问:
# z) T: P2 T- K" T对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中? v" a, R! ?3 h# `
, a* _, f- Y; L8 s. w) W答: ) x: }, K9 D2 l$ O3 Z4 e
目前,没有直接的方法可以将对象写入到随机存取文件中. L7 ?) d4 P" e+ P
但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.
& r5 H6 Y3 c2 j" Y& G* [1 z R
; C4 L$ d. x' [& O$ k: t4 e问:
n( _# o5 t8 ?. i运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之? * [ y! ~( d9 o4 {$ E
2 x* s) K; {- [# {* m* ?
答:
5 K* J" U5 M+ Z2 m% M8 A可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.
( `1 C8 n0 h$ t0 `; l/ Y1 ]6 O8 ~, g* F# i# o+ o
问:
' z/ H' Z2 b1 k使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性? 9 D" O3 n% J0 c/ ]. b
% _, m* i/ B5 P6 ~4 A; n1 v3 C
答:
/ b6 H0 @ g( w1 c# }使用如下方法可以获得PrintJob的实例用于控制打印操作: $ o4 R% ]5 i% F, n" }; l
" c/ ?. s! h, q# Z' Y
/ s* ?* y+ j! |* D& }! QToolkit.getPrintJob(Frame f, String jobtitle, Properties prop) 9 u, v( g" y6 k3 A" W
! {7 B5 ~; V5 V! j. k$ ]: l, ~6 F
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:
) b6 U5 l9 D8 a& H' f, }$ q! x- N! H& r' H6 J" y' t
awt.print.destination: 可以是"printer"或"file"
# V4 x; _+ B" R! x# e0 o( O+ c1 @1 n+ d2 y5 u6 w+ E
awt.print.printer: 打印机名
* {$ t9 k( p6 u. s8 o0 Y
' ]2 s' D1 q6 p3 W3 `awt.print.fileName: 打印文件名 7 C3 T( L1 a# A+ ~
7 E! j- C: f( Q: V2 qawt.print.numCopies: 打印份数 ; S, A5 i; |/ y2 y
& |2 J4 K" e6 G+ C4 Iawt.print.options: 打印命令的打印选项 + L. x% f8 o' h: G& h R t
8 o0 r1 B; g" d7 b) P) Y& D& c
awt.print.orientation: 打印方向,可以是"portrait"或"landscape"
- k. I" ]# ^8 l2 s3 q) y7 z# J3 ~
" f/ `5 a1 O$ g' ?& ]9 dawt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4" 6 I- k$ v. t4 A z1 W/ Y1 @) E
$ s( X1 g4 ~& T" O' c
, f: z" H$ a. d
s# I% ]1 @' p( p, ]' q
: ]( |" u r+ c4 F5 Z" H
4 k/ b* o8 I+ j2 o# Z" [8 M2 M
" o4 ?8 p+ }3 @9 U$ O" _# B问:
- v i" G% R0 o: j' d1 D. M在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之? 8 [6 w3 y3 V1 ~* k; I
' R& |# I3 y! m* a+ \. e' L答:
" K+ L: Z* [0 o% U* c3 qThread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.
6 \4 H8 }) X3 {1 s
8 n$ D6 h. y. J! I4 h! u$ F$ M- c4 ^因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它. 1 [7 a& j7 ^: f: h/ y$ Y$ Q
+ g$ `3 m3 d5 K' b
问: - V% R* y# W9 {$ H
使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行? ) ~* \3 v+ K. q9 a2 F# F2 c* l" V2 g
* H* }* r. u% H
答: ' s( B2 Y, l5 e3 M) I* }( p! O. N8 r. ^
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:
9 r' C+ j8 s- a* {0 n- m& S/ b' q, N
' w7 G- E q. m- t
ResultSet.first():将数据指针移到结果集的第一行
5 i5 ^& `& @' m& G# e
+ U- g; R. S7 ^3 g9 ^0 ZResultSet.last(): 将数据指针移到结果集的最后一行 + \' C$ l$ W3 G$ a
0 g) g8 }, e3 e) E, y* ?! S4 f
ResultSet.previous(): 将数据指针上移一行 & W: C9 [$ A A3 d0 i9 T
- A; S2 J1 k8 O4 |2 J3 z
! `8 {5 R2 k( |& S7 b1 x. U
以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .
' y1 g1 u& v4 A, S% \* a; T" S- H% v9 k) _
! C/ e+ z" O( H" J% b$ G
问: 1 ^* F0 ~: v$ [* l0 f7 G
哪几种Web Server支持Servlet?如何使IIS支持Servlet?
% @$ |) i+ _; a" y
/ `1 c- R& Y# S) L# H4 i答:
% F& g! X* H5 O, \, N目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等. " Z( O8 d, V5 ~4 m
3 _) L8 G5 O2 z# M3 ~
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.
* v `- b: p& S @0 \
1 ^1 Y; n7 g8 N/ E( ]9 p问: % ` S4 V9 h7 p" [. Z; T
如何在Java应用中将图像存储到图像文件中? 0 r" V6 |; } @! H8 y
* {% [. ~7 @2 k+ C4 w答: * y5 I9 X5 q3 M4 w1 r3 U* `4 Z
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:
3 ?4 }0 k& z2 ?3 B5 J* h/ P( `$ v& T* a) E4 I1 j! u, U7 Z- V c
1 Y. K" y: _$ `; Z4 g' M) ~
OutputStream os = new FileOutputStream(fileToWriteTo);
. ?$ z/ r& a v; f! p2 G# x/ P5 Z6 t( L( `& m1 n7 k" O& M! U; g
BMPEncodeParam param = new BMPEncodeParam();
! o) L3 m0 P9 G0 z1 h% ?, o' Q3 ?' q5 y6 L, l. w/ y4 y2 u4 K H- Q
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param); . w* T* y/ J# G) _' |- N- k) q+ m
a7 _( h2 g9 q2 Q- Y. venc.encode(img); # r. |; O. a V% ?3 y/ U! n l' a
/ R, @3 X, E3 ^" d# `- l! w3 {/ aos.close();
$ R! E' M" ^8 P1 T- C' V5 b1 C9 Q2 \' W
有关存储图像文件的编程指南请参考以下网页: 8 |& u4 {7 Q( G$ _/ T5 i
( m* K$ [" g1 {' ehttp://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/
( P5 S2 a. [. t3 I6 y/ N
6 V! i- A; c6 {) o3 M
: N- [! N. t) e# d4 H2 U5 G3 o( U& C5 q! h- a0 X/ W$ V
) Q2 b5 C5 j( q; Z3 P
问: ' ?, V: O D5 {1 d5 B
如何用Java语言向串口读写数据? font> ; l/ l" z- e1 y# a
+ k$ f1 ?( F5 I) M2 P1 z
答:
+ w( x& x' ~ qSun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.
; |; e2 G2 f- N" e: n( B/ t, `+ n7 Y- Z$ b9 T* I3 B
详细文档,请访问:<a href="http://java.sun.com/products/javacomm/" target="_blank" >http://java.sun.com/products/javacomm/</A> |
zan
|