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