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