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