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