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