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