QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4946|回复: 3
打印 上一主题 下一主题

[转帖]Java常见问题集锦(来自Sun中国官方站)

[复制链接]
字体大小: 正常 放大
god        

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
问: 如何设置Java 2(JDK1.2)的环境变量?  
8 T! s( i! @( F: V9 }
+ Q4 e  Z7 N8 ^6 F答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径.  
( i1 P- c- [- w; LJava 2环境变量的设置如下例所示:  
. h) l7 J) X4 c3 |Solaris平台: setenv JAVA_HOME Java2的安装路径  5 S! \' u& R2 s+ z' ~
setenv PATH $JAVA_HOME/bin{PATH}  
8 k+ \! K, t* [( X& v8 e5 I8 RWindows平台: set JAVA_HOME=Java2的安装路径  % e  L  `& J. V  [: g
set PATH=$JAVA_HOMEbin;%PATH%  * Q. `! y9 D. Z3 U. C

9 d( K; T& M5 U( `1 t- m问: 哪些Java集成开发工具支持Java 2?  . \; {& F; l. W8 @" r

+ K1 }. K7 M  P( M答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.    }  K# \" j4 v( j
- {3 V" D; a% H" B$ ]6 ~
问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?  " r* Z5 Z+ C; W6 j" u. y

( o- ~) u$ t: t4 G* k答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.  6 i4 h3 U# R9 o- F
    如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.  # R% i$ F' f- d9 ^. C- q
    如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序.  
, j7 o8 A. h" I% K
# T0 Y4 Q9 x$ ]$ i8 D问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?  - G) n; X5 D) @+ U
5 {. p! G: \; y7 h7 O9 {
答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.  
# E) F3 O" C  m6 S# ^0 f" D7 z( w+ Y& |
当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现:  
) E5 n2 t6 F0 L5 Y; P! S. b4 T
' G7 N6 }6 S- W$ E
9 Q% |1 `' I6 s# @4 s8 O2 z7 TString native2Unicode(String s) {  
- ~; L& r+ f9 f$ N8 Y- v# \$ \  C- j' l6 f3 r
if (s == null || s.length() == 0) {  
2 D$ P: e) t0 H- Q/ d9 n
% M9 T1 l3 i# ~. Creturn null;  ) R: [$ x# h* J2 }# W( W) B8 p
# u, M3 d& A8 L0 o& p
}  
7 V8 [" u$ I" T  \' l" x0 N2 R' A# I8 k' I/ s5 K
byte[] buffer = new byte[s.length()];  
5 a4 @# G0 y5 O2 }( s: B. A# ]
4 x" A% }, ~) q: V! D- Kfor (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {  8 m# s+ ]$ I- N
8 {+ j6 ]' v! V, u1 L% ^
c = s.charAt(i);  
' [1 R( @7 {7 q1 P0 {- g; g/ w# [
+ m5 d! v8 N9 obyte []buf = (""+c).getBytes();  # W1 L* D4 l. w) {. g+ c4 z

9 f4 m: b) E( H2 R9 P  H$ Abuffer[j++] = (char)buf[0];  - j8 h( @8 S* e: D6 d
  v7 L- `" T& R7 o4 s
buffer[j++] = (char)buf[1];  
+ C( d7 X5 U9 ?! W  o
( {, ~. C* ]$ k3 T1 s2 h}  6 D  H9 q: I5 t# J5 C

. B: D+ ?2 @2 e! ^else {  
8 |8 W# J# j- @0 s  F: U7 l5 I  x8 V  z% l
buffer[j++] = s.charAt(i);  
; L$ Q# F7 E% y$ P7 ^- O; \. C6 Z" f: w  D, k6 |( Y9 e+ n
}  ! G, j) f5 u0 {1 s7 E! Z

5 U0 Z  ?) I" Q: T" u: n}  
4 @2 ]1 A1 Q( t
' `) }; Y6 y5 p2 i5 o5 Rreturn new String(buffer, 0, j);  
$ @  j- m2 ^* s. Y* y
. i& ^6 u" k/ i1 P. z. K}  8 w2 S/ S# ?0 b
; S# v* S) J. ]) V; p& l( @" X
除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.  
4 ^; d: V! L9 S- _2 W* d& N$ U
% e3 M6 P* ^1 o  q5 l
问:  
( L+ X) E+ Z& ]' w6 w3 r; D3 E当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?  , y4 V3 V& z  J8 c  v: i3 I( _

8 d  T1 I: `/ K; I" K5 K! F, q答:  * P. H6 p$ [& q& y0 e
javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:  
4 B( N* R0 D1 ]: Y3 {. q/ M( P5 v! L& B4 E

9 Q" O5 `6 Y+ U$ O8 j3 X' apublic void doGet (HttpServletRequest req, HttpServletResponse res)  ; P& t. c+ G/ F0 c0 E

$ a, D3 O0 V0 m" t2 d9 c* m) fthrows ServletException, IOException  
+ D  _+ X* q- q
6 \, Y: p1 g5 B0 _{  
8 O% t; @8 W$ p, P- |- T/ n$ E6 s& U" H$ h
res.setContentType("text/html");  
$ `' g8 V; @; m: W" A8 h* U8 C  N  l$ P
ServletOutputStream out = res.getOutputStream();  
3 L9 o5 Z" U& c& J7 J  r( Z! [
/ Q' \1 Y' H) J% h2 lOutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");  ( ^1 f+ X) t( O; Z) J1 i
% Q( [$ A/ `) h7 q
ow.write("这是测试");  & u  ^) Q) M/ n% _& s5 a

* S6 U" n+ T( a7 t# ?; K) {' ?ow.flush();  + f' f; [( m, r" Q  I) f
' R1 K! K% K  W
ow.close();  & g1 C* H7 N! ]2 u
2 r6 E! |2 @9 N3 J( S
}  
. Y8 F3 ]- }( {8 _: O' R0 a. q
$ ~: I& q7 K) w% d0 k- {+ W; W. h( k0 @9 A7 x9 @: m* j$ ]
问:  . s" x" Y5 z7 Y. f, h
如何设置Java WebServer的CLASSPATH,以包含用户的class文件?  
# E- ~2 A4 l: l
  ]8 Q' L) Q/ Q# F+ v答:  ' T# N; g1 @! I# d+ a! F( b
有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.  ! [2 r  N4 s4 f8 G% q1 \
将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了.  & V: a6 F, C$ B7 M0 x* P: G2 l4 b
修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中.  
  V% ]( I+ ?& \) p/ n1 B$ A. c+ g+ H. s& \) [  S5 ^
3 A9 y& e) W8 M4 }
问:  . z8 g0 X5 O) X6 T
为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?  
9 |  w* p, |# L1 c! Y9 l
/ M) ]1 ]8 U) r答:  - u. W: j' d% }- }! L: o6 g1 @7 D
机器的网络设置不正确很可能会引起该问题的发生.  
8 f5 K3 S! `1 _4 U2 oRMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中.  
' R& y6 u+ M/ W9 A
& m7 P: @  B. U, `8 j* z! i* r如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:  
+ _) A7 Q" Y- @( c, X- h- \; G' |
/ `. m  w3 w/ p1 R3 B7 FIP地址 主机名  
) ]' U$ \/ c* L; b- i$ X5 b# A  N* |! d5 [- Q0 t& @
如此设置应当可以明显地减少查询所花的时间.  
, j, C. s6 H5 M$ m6 y# d4 e
9 o: B8 t0 u* M/ F9 F  e- Y1 S问: 编写Java application时,如何设置proxy的信息,以便访问外部网站?  , h# E" E6 Y9 J' ~

: R: Y( N7 m: r( k& u答:  ' E; F8 r& r& ^; w! Z
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:  ( N+ R. K  ~& _+ K# b  R+ r
* G2 G8 M9 M1 Z! I7 R

# a, m  Y# h4 j5 ], Q5 @import java.util.properties;  : z$ Z5 h2 g7 {/ N* ~

% N5 T4 l1 w  g.....  3 F* [4 e! w) n& ]
8 W1 T7 N' X3 q* ~- \$ ?
Properties sys = System.getProperties();  
3 I; r: T  n8 W; d+ a( [
+ b9 e7 |6 y) h$ z/ z. Msys.put("proxySet","true");  
7 |& n$ A( L* m; L
# |' F$ I: A( _0 _+ osys.put("proxyHost","myHTTP.proxyserver.com");  ! l3 A) |1 E% `% f
& M) W& V. n) S
sys.put("proxyPort","80");  % Z3 c7 k6 m9 j3 u, U$ q% U; M
* ^$ L  i3 W0 Y" \- u- g
System.setProperties(sys);  
9 x3 Z# j& L4 Y' l2 r' c5 S/ B, s4 l2 \# Y' ?) H
! i5 Y5 `, c  R. Q) }
4 E% l, ~0 t+ t! R5 I
u = new URL(website);  ( k. g$ `8 J( q. {7 D. \8 F
" a: s9 @. l* ~' L% I4 w
connect = (HttpURLConnection)u.openConnection();  3 A/ m9 z. E/ D
9 a. J6 j: L8 E6 N/ a% Q
.....  5 I& e5 P& |: f& `  S8 r* O

1 ?  o; N9 R% p3 F5 q% a问: Swing组件JList的列表数据修改了,如何通知JList改变显示?  
( F  ^& S" l. Z6 M' J8 x0 g7 @) G1 L- n# `; c
答:  : B/ Y! M! B: W9 ^  c' Y& n0 @$ f/ ?
JList组件有一个单独的显示模式ListModel来表示JList的显示数据.  
! z1 E3 L1 w! \5 d0 E( D+ ?JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变.  9 X4 O$ z1 X/ G; O  K
JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者.  2 j- {. r( h$ u% C1 X& O
当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变.  + y/ z. c% o: I& T$ ^' g7 e
: U) R' @8 G9 n9 g
问:  
8 i: Y2 R' E$ p5 `在Java applet中如何实现一个模式对话框?  
2 L% U( o5 v9 T4 X. s$ x% ]6 @3 o0 D6 t  o0 c8 K
答:  
$ P  }7 p9 @7 d, N' V2 }在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:  
* @, c' t5 L/ i7 |  P0 }2 E
* `; g9 D8 }/ R
2 k( d6 l0 j! F" L- Y3 p4 ?.....  3 f$ e' [2 W; ]# {$ ?; ~/ o: i1 V6 l
, z% T* w& y: b
Dialog d = new Dialog( getParentWindow(comp),title);  1 j, j0 g% D% }" f3 ~2 f: O2 t
# {) n! [( W- ~. P
// comp为applet上的任意一个组件  0 f$ o1 q( M' Z2 }$ Z

& I0 ]( t4 n; a1 B/ k% U....  5 z2 {7 `% Q1 Y% r* i* Q' p$ }# e
" X: c3 \  u5 q. w1 |0 L' `' f# C

: m; D# Y( M' t3 Y
9 w+ `: c0 v: Q/ l  ^public void getParentWindow(Component compOnApplet,String title){  
* P1 Q( f* a5 C. U3 L& {; w; e) d- q* @1 d* u3 f1 T
Container c = compOnApplet.getParent();  - P! m! @8 l0 A/ t6 X# T

4 D8 T3 o4 a+ p( X1 ~while (c != null) {  4 P+ w: v2 L( i/ T: I* z

" u1 n, ^/ r* a$ Q/ Yif (c instanceof Frame)  
) G; p' E6 v* i: }# l; K7 m. R- }0 M" q
return (Frame) c;  
; m5 L& @) v' m: |  L6 Q* s
9 M9 g8 l1 \" m+ y$ [' _c = c.getParent();  ! w" T! Z0 S7 t5 S+ n# Z

9 B& {# C8 \. k}  
. w/ ]) P! v$ z7 a
  Z* O6 j' p$ F& [7 \return null;  3 J" z0 c- a; L; R* `- U
" P/ F& u7 d) [3 S% a6 A+ _
}  
$ c9 m7 d- x, p% d4 L' F% `  [( m; X4 ]1 U- b% |3 F' N0 R% _) x2 a
问: 在Java applet中如何显示另外一个HTML页面?  % O) G( X3 ^! }) v/ k

/ I# T' Y' a! p% K) K答:    H- D1 w7 a# }. Y6 R
通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页.  
; h/ `) v0 {$ w1 r! `2 N6 J; u0 |
: B% v# `/ ~3 X问:  2 p" y' v2 t, j6 l. l' B; Z
用JDK实现的签名applet,可否在Netscape或IE中运行?  
" T( i2 t1 w3 P- g# m. O6 l" l9 s& D! [
8 C7 k5 n1 w' J- g答:  
: {# y) H& g& b4 V用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.  - f8 C- i' @! h0 p: d

  ~" P; G) Z, X不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.  
2 I/ |, k* R6 O  q1 T5 y$ V( j
' M. X: Q# {: q如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.  # Q  T3 y0 k4 q/ g6 Q; w# S

) F; _8 ]3 \: Q# c- N& D$ Z" v问:  ) s: z: X7 b% v" R* d" M
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?  & E$ p0 t9 [9 W( y0 u6 p
/ X8 {' G; ?# r; |
答:  2 g# e5 F7 f" W# i/ J; y* K& L6 i' b
如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):  - w0 P/ B6 g" U8 h: y% D" \9 j
编写调用C库的Java文件,并编译.  8 v" t' v. t5 b  \7 F: H9 Z
javac java文件名  
9 u; F! x2 a8 T5 ^. O0 s* ^" Y6 w5 D( N+ D

6 s* d) t8 ^/ Y6 h  O- b6 V, B产生C程序头文件  
1 u  Y9 B% P4 _( F% y; Fjavah -jni java文件名(不带后缀.java)  ! f0 ?: b' z; A; g2 n; j, Y& J. D
% C/ c/ d" N# T% z% \3 j! N5 V6 F+ v

  ^; F& {5 Z5 l: Q5 K% S1 }5 N编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.  
, C' Y$ V4 \9 X, ?$ d, Dcc -G -Iinclude路径名 C2.c -o libC2.so  
! i4 p6 U+ ^7 X$ p, b6 g0 M( o& \" Lcc -G -Iinclude路径名 -lC2 C1.c -o libC1.so  
9 S7 O' @* W* p" ]$ N1 \1 y2 J) I
! _% h! g9 q# Z5 w: \: N
; v4 L; `9 v, Y9 s/ Q0 X设置环境变量  
/ g+ F, R$ L& F3 u7 X8 Ksetenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径    k& o0 m  x- g6 ^1 n5 q/ @: A, @
{LD_LIBRARY_PATH}  
( G3 o! U0 s, I, ?' r
6 o! d. X$ a  E3 o. K7 Y1 |6 \2 q1 p2 _% Q6 K# n
运行java应用  
# g: w: t: T" B, j( g0 W
+ d% }" B; s) z
0 D7 A* ~7 g. k, F0 E7 ^问:  4 A+ z2 L, j- s5 g
在Java语言中,如何列出PC机文件系统中的所有驱动器名?  $ k( [. T7 }0 a
2 J" ?+ ]9 `6 W% Y& ]# q6 e
答:  
$ @" U2 Q* E& C) a5 y在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.  9 x3 M3 q3 E! T& P0 _2 d

- R" S! K8 j  Y7 E! R) X$ [0 P4 L问:  8 J7 i9 S/ E( ~2 T8 ^  }0 N# M) p
为什么Runtime.exec("ls")没有任何输出?  
* _# ~9 B& B1 a0 Z/ f; E
; h+ n) Q! l) E3 i7 f答:  0 P4 A5 W6 r9 ^8 d) `6 Q
调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:  7 L2 N4 ^. J8 M5 C% M
7 R, L2 I* W( z9 H1 R% l' P7 `9 k0 ]6 x
+ n$ ]4 s. F* v5 D
try  
+ M) R6 Y5 i# f. Y
# O3 S. _, q" \) S2 s6 @7 X" f{  
1 w. c1 N/ n" w0 q8 i, H: s* Q. z- u- N$ B- V; q& s% z) o
process = Runtime.getRuntime().exec (command);  5 y( q! U& U. F& I" G3 @5 @; @
3 p; n; u9 V/ p/ `( a% s) p
InputStreamReader ir=newInputStreamReader(process.getInputStream());  
# r0 Y5 C2 U$ @. Y" w- t3 d& n! ~
% x8 `+ z6 R+ }9 {0 P4 {& oLineNumberReader input = new LineNumberReader (ir);  6 N6 a0 B: z% `: `
+ w, x, O2 K% A6 }
String line;  ' C1 C# n" G. F9 Q! R! k4 L- H( I

9 T. S2 H9 g0 Qwhile ((line = input.readLine ()) != null)  7 j. C/ j- ^' d' V4 v, q3 {

2 W) w, r) G- p' {) n0 ^System.out.println(line);  
" ~& D/ c- }# y' L* F( ^  l! S
8 _/ K% z! }5 M' C: S6 L1 I5 l}  / B" O* A, `  A/ E

7 B$ X! n6 X& ?5 q# R; ccatch (java.io.IOException e){  
8 G" f# X4 m: K  U5 R2 H# Q
1 {! a: t# u7 qSystem.err.println ("IOException " + e.getMessage());  
; M+ ~. x% f0 s- s- i
6 s+ e% s6 h$ w1 D9 ]" }1 `}  
+ x  h4 N( H0 S7 R+ m
2 u- k: M* k8 ?; e; j: c/ n( B, }) H" \. k5 u- c$ t: T$ ^# Q) x  c
问:  + Q# W* X7 _4 u! j/ e- q
如何产生签名applet,以使applet能够访问本地资源?  
6 }8 x% J6 s3 J7 B. D
  v+ {% [! X( u# D4 Y4 I' N$ s答:  
; I3 c# r7 a" x  \$ {% g8 P0 g- @在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' j; M5 k6 F, l# l: l8 m! E" ?2 }2 g! t9 I7 P' b
8 [% a" l7 x5 X9 Y# H9 N; S
//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中  
9 L) e8 R! t2 W2 {) b
) N( R3 r+ B' E  u* T+ Vkeytool -genkey -alias joe -keypass sign12 -keystore joestore  ' o" j4 ^3 [2 P$ Z7 |" T% Y" c

8 _% _$ @6 w; M6 Y2 J( n//将SignedApplet.class及相关文件打包成jar文件  2 L+ m7 p- a3 F9 m% K- Q

6 d/ X% p1 p/ Q$ ]& l# djar cvf SignedAppletDemo.jar  & i! _) z6 W9 m' `- ]* j# t6 R
$ w& u* Q( _. N) Z1 p# _% t. y
//利用keytool生成的自签名的证书产生签名applet(jar文件)  $ u6 M. O' A& b% Q4 \) n3 z

5 g( M4 b; B4 e. |0 ]- Yjarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe  8 W2 N+ l: Q- I- `" ?

# `0 y2 O$ i. E  }//将自签名证书从keystore中输出到文件  $ A7 z+ d- p; S" W' z. `7 D" X$ J
2 ?, q; p' Q, h( z& ~
keytool -export -keystore joestore -alias joe -file joe.cer  / k$ g$ w9 h' y( G: V) n' R

7 \/ h2 }. D; A
3 g+ l$ T0 ]6 s6 @( @8 e, m$ d% R9 }9 v/ H& C
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行  
) g" a  r* w# m6 [9 b5 h" {+ m/ V5 S  B3 A6 W  i" H
Joe编写的签名applet:  
! Z/ }  W0 W* _( t: L" O* e
. p1 h! c2 M* T" b$ q- ?//得到Joe的证书并将之读入到密钥库中susanstore中  
- R4 M. R3 U" q. {& B: }. W4 F/ [% Y, j1 ~
keytool -import -alias joe -file joe.cer -keystore susanstore  
: w6 w5 d# b* e- m* t$ ~7 e
  A, P& g) e( W2 \//运行policytool产生满足Susan要求的policy文件  
% u- V$ B: i* \5 W5 P2 U
2 r! I2 e5 Q5 S  \policytool  
2 g3 q" Y9 |+ a6 L' ^4 W" s- V- B
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.  # y( r' A: \# E; K' }, g, p( a

# s" o5 N$ e6 O: h9 ]; ^2 R  V: W. p* ]7 t0 q' |; V( Z5 G

+ ]8 u, ?7 T6 ]% n8 `' ~关于签名applet在Java Plugin中的部署请参考以下网页:  0 B' {& j" e7 v8 F/ h

. v  [+ o) n: m& P. ~6 n! c* X% Y# ^http://java.sun.com/security/signExample12/  ! ^& d8 j* T  H0 y) g8 u

6 H  U$ O, \2 g) B. A( J. c4 D1 X1 W

+ S. ~5 d& G  a! {, f" y注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以  9 q6 h) ~0 j. U

2 b( r9 E4 F& c1 [+ \" p  P4 t使用keytool -certreq向商业CA中心申请电子证书.  6 S8 P, R% j2 \# G$ {6 w

5 F9 L3 ^+ y+ w" {& r
9 V3 b& x/ S4 [7 ]  L& q# @; {* W. V! y+ X5 k1 M9 l# ]

; r/ T& u; P3 J; h$ k问:  1 W: d0 Z2 ]; v( F2 U$ n
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?  
" |- |! j6 v5 f" N( q( p4 S& i, C. t
答:  * S1 a( ?; A- q7 v4 |+ a( y* ]
使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.  
- r7 \2 X. l% d# R* \7 o3 J; I9 O6 j. D! R8 S4 t2 p- W' A
问:  
/ J: }( n) b0 g  i对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?  - `( E/ H& \: l) o  ]* s9 U  I
0 t! D8 r; ], C; d& A  s) f1 y5 G
答:  9 o4 ~, ?# M- f3 R) _. ^
目前,没有直接的方法可以将对象写入到随机存取文件中.  - ]* \) s. i: T
但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.  + l3 I  C  @) _! S3 z

& R2 r( S) j8 b, }9 p" Z, y问:  4 F" L* U1 L  q/ a9 P1 D, F
运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?  
3 `& B% D+ R, K9 U+ j) U  s
! R! o3 i; J4 u' q! J答:  
8 ^1 T/ k+ q6 m可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.  
$ U( N# ~1 m% v/ U9 g) V! V! f: D/ V; i# k" S% f
问:  
1 [3 \" g% ^+ f  o2 k使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?  
9 x! Z8 N5 E3 D% ?( T$ u% t  _! \5 }: ?( x
答:  
3 q2 T& w" h+ l使用如下方法可以获得PrintJob的实例用于控制打印操作:  5 D8 X+ W1 W4 L* a2 \) s

0 l8 t3 d. v$ U" z2 D3 q( e
: I5 C2 ]# ^# T3 V$ m. {Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)  $ T  [) k  x  x% U; O; J9 A( V( w
5 g; B( u8 L$ ^9 }
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:  
# V9 r! G: f( x7 O8 ~  p  B" C) P5 w# c) j* x9 q
awt.print.destination: 可以是"printer"或"file"  3 e7 Z/ z% L0 U
* u, V$ Z- @( x( C
awt.print.printer: 打印机名    }+ X+ M9 Q; ?) Q0 ?8 s

9 ~  Q6 w5 H/ W' P* kawt.print.fileName: 打印文件名  
) ?; m- L. ~% S  K5 z+ g
8 V0 ~5 n& ]8 Iawt.print.numCopies: 打印份数  . s( F4 R( L9 q) M
( u; u* l; H+ t6 G5 S
awt.print.options: 打印命令的打印选项  ; h) C+ F9 g7 ^6 f* q9 m

: t1 b$ Y7 r) H* U# H7 Tawt.print.orientation: 打印方向,可以是"portrait"或"landscape"  ! T9 d6 B& }& `* {8 W' `7 Q0 C

# L  `7 \/ h9 o- Y! Z" c9 Rawt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"  ' H  {1 A. t" d1 R
; \; C9 [" D! \
+ L; K* ^% E% r& X- y

* M& @7 q$ m9 o% V  N+ W0 W/ i; o: _. @! X: V" V) A: H5 Y

. i: p" e* [5 K1 h( X  s
, ]4 {3 A) K. d2 V问:  
5 Q' B! Q& J7 ?8 Z. u7 A$ ~8 v/ S! D在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?  # A' u$ _/ Y( T/ s* }1 B0 A

8 w. Z# C9 v6 @  E1 A$ c% m( t答:  
* q5 g8 [1 a$ ?4 F/ }5 K/ ]' QThread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.  
  w4 M5 I3 z0 Y
" ~# j, X" E4 `, D3 D! w$ L4 x因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.  # q6 A: P. b, y; D+ I% {
: d7 w- a4 Z4 H/ M" t2 e. Q9 G
问:  
; y4 g' ^- |: a$ N* p使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?  
$ r. u+ ?& a0 N" j9 x' m5 \% E2 U+ M! K
答:  " [; a, R7 i7 b; D1 t7 L
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:  
' X1 @( ]" Z$ ?& C; U
! z% M8 D! F2 s+ H5 G8 d; B2 N& f3 u& X
ResultSet.first():将数据指针移到结果集的第一行  3 t8 Y; O' y  ?6 a3 p3 k

& |" l! I. L! P  ^  O* P) z/ lResultSet.last(): 将数据指针移到结果集的最后一行  
+ R+ L+ Z* j* [5 f6 a) g" ^0 U) {- P% L( x8 j% W
ResultSet.previous(): 将数据指针上移一行  8 S/ u+ |+ ?: ]  s8 C

, ], o% j6 g: [9 Y1 ?3 E! @' x0 p6 n7 O* I3 D( X: v
以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .  1 K9 j' \0 h5 t" [8 e0 q5 T" K

- l$ R8 z  G" Z: j& g
( |  o4 u; o- Z+ A  R8 z9 H. n问:  
* S- D% Y6 z; P4 q/ ^) x哪几种Web Server支持Servlet?如何使IIS支持Servlet?  9 T) b9 x! p' D- W; j
4 u9 y5 u4 B$ p
答:  
/ q) P4 m& G- M( u7 d目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.  2 w# X( F+ q7 }6 b. k* P- l
9 D* Z7 y  Y; J# p
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.  ' ?1 r2 V5 P4 f# s! Q

, _# [( }& S1 [9 V( F5 m; N问:  - }$ d2 N1 ~8 H3 `
如何在Java应用中将图像存储到图像文件中?  $ v/ H( Z! X( _  E* G4 u6 D

3 z8 M/ h% ]2 _- a( n答:  
, ^3 n% I6 _( ~$ H3 xJava Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:  $ D, e0 |* \& J/ n
# g' i: @4 \+ I& |+ e
& y2 e* F& z  O1 L+ S
OutputStream os = new FileOutputStream(fileToWriteTo);  
: D' z; ^+ I) n4 s: p1 b
2 @' k. ?6 D$ sBMPEncodeParam param = new BMPEncodeParam();  6 e3 D) P$ ^: t5 P! [: K) E

. q( M# C' A4 R* j) ]ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);  7 W2 l' ^2 X+ x/ t& u! F
- a8 |7 i. z# P2 s. }2 a0 F
enc.encode(img);  
5 `- L- S, K6 y" D& Y8 J* A+ c# y& L0 z8 A: G
os.close();  & a" `4 }: L7 ]

, @! ]. v; {. G. f1 K- A有关存储图像文件的编程指南请参考以下网页:  
7 q+ y/ M9 j- }# i9 u9 ^
4 }+ }6 c' O! i: A$ Z- zhttp://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/  
9 G7 E4 Z7 I, |. e+ y: }2 I9 E) |7 q& L1 ]5 W: y

; W6 s( R% V: Y+ ]
* g! E0 O3 l/ V
1 R# C) S+ a+ b2 O, {  ?. g$ p问:  
. M8 }& A0 a; U* `/ W1 C; n1 m如何用Java语言向串口读写数据? font>  
* O( Q6 u. k6 A! A# o' [) k( X* Y) o7 S7 Q1 F8 s
答:  
6 d5 e* O% I0 F/ S- m! xSun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.  7 Y( W; G7 H0 t  R3 ~6 O

7 n" u3 F% T( T; k8 y$ {详细文档,请访问:<a href="http://java.sun.com/products/javacomm/" target="_blank" >http://java.sun.com/products/javacomm/</A>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
wangyu249        

1

主题

3

听众

54

积分

升级  51.58%

该用户从未签到

新人进步奖

回复

使用道具 举报

wl820609        

1

主题

3

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

deven1985 实名认证       

23

主题

3

听众

2433

积分

智慧的蓝色小毛驴

  • TA的每日心情
    开心
    2011-12-5 23:03
  • 签到天数: 106 天

    [LV.6]常住居民II

    自我介绍
    200 字节以内
    不支持自定义 Discuz! 代码

    新人进步奖

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-14 17:18 , Processed in 0.441203 second(s), 70 queries .

    回顶部