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