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