爪哇的工具安裝與使用

[ 首頁 ] [ 上一層 ]

 

多媒體廣場
偶像台
情歌轉播站
妙韻送知音
古典音樂放送
電子賀咭
玩Games堂
巫毒視訊
遊戲下載
電腦遊戲密技/攻略
PS遊戲專區
心靈雞湯
青少年篇
新知舊語
愛情組曲
性疑難
心理測驗
鬼話連篇
兒童篇
兒歌金曲
家庭篇
健康家庭
社會工作理論
社會工作實務
社會工作研究報告
社會工作資源
心理學
打工仔廣場
工作指南
工作簡介
職位徵求
勞工法例
區議員會客室
全港議員留言版
全港NGO非政府機構資料庫
社會服務機構網站連結
繽紛樂園
青少年活動推介
讀者留言區
笑看人生
社會事件公眾討論區
泥上鴻爪留言冊
告示板
網上交談室
福音餐會

爪哇的工具安裝與使用

安 裝JDK (Java Development Kit)

取 得 JDK 可 在 http://java.sun.com/JDK-1.0/index.html 取 得 JDK 1.0 (有 Solaris, Win95 / NT的版本) 。 

取得單一壓縮檔 , 解至某個目錄。

0.0 哪裡可以找到 Java 書籍的相關資料?

0.1 有無 JDK 1.1 的 bug list ?

0.2 C/C++ 的程式要如何轉換成 Java 程式 ?

0.2a Window3.1 有 Java 可用嗎 ?

0.2b 其他平台有 Java 可用嗎 ?

0.3 有無 Java 寫成的 shell ?

1.0 編譯時出現 -deprecation 是什麼意思 ?

1.0a 我的 Java 程式改用 JDK1.1 編譯後, 為何出現 OutOfMemory 的錯誤訊息 ?

1.1 為什麼我連像 "hello world" 這麼簡單的程式都無法順利執行?

1.2 如果 Java 沒有指標, 那我怎麼處理像 linked list 這樣的資料結構 ?

1.3 到底 Java 是如何傳遞參數的? 是 by value 或 by reference ?

1.4 String 這個型別的 class 為何定義成 final ?

1.5 finalizers 和 C++ 的 destructors 有何差異?

1.6 "private protected" 這個修飾字為什麼不見了 ?

1.7 Java 裡頭有沒有 sizeof() 這樣的用法?

1.8 我繼承了一個 class 叫做 Frotz, 編譯器卻給我 "No constuctor Frotz() in the class" 這樣的錯誤訊息, 為什麼呢 ?

1.9 使用浮點運算時出現 [unexpected] , 為什麼?

1.10 以下程式片段編譯時為何錯誤 ? (初值設定問題)

1.11 為什麼編譯以下程式時出現錯誤? (public 修飾字問題)

1.12 怎樣讓字元 (char) 型態的東西轉換成整數 (int) 型態 ?

1.12a 怎樣把 .class 的 bytecode 轉成原始程式檔 (.java) ? NEW!

1.13 我用 C 語言寫了支程式, 來建立一個二進位檔 (binary file). 但是當我想用 Java 的 DataInputStream 配合 readInt 去讀檔時, 所得到的數值卻是錯誤的, 為什麼呢 ?

1.14 怎樣產生 Java 看得懂的 .zip 格式的檔案?

1.15 一個一個重新編譯(recompile) class 檔好累, 有沒有比較好的方法?

1.16 在 Linux 下如何設定 JDK 的 PATH ?

1.17 如何解決 Win95 中 SwingSet 環境變數過長的問題 ? NEW!

1.18 為何執行含有原生方法 (Native Method) 的程式時會出現 java.lang.UnsatisfiedLinkError 的錯誤訊息 ?

1.19 怎樣清除 TextArea 物件的內容 ?

1.19a TextArea 物件裡頭可容納多少字元 ?

1.19b TextArea 物件裡頭能否針對不同的文字作字型上的變化 ?

1.20 怎樣用十六進位表示一個整數呢 ?

2.1 我的 applet 原先好好的, 一放到 web server 就會有問題, 為什麼 ?

2.2 為什麼在 JDK 1.1 under X Windows 會出現底下的錯誤 (字型問題)?

2.3 如何使 applet 的背景呈現 '透明'(transparent) 狀態 ?

2.4 如何在 applet 中讀寫檔案 ?

2.5 如何在 java application 讀寫中文文字檔 ?

2.6 GridBagLayout 很不好懂, 怎麼辦 ?

2.7 如何得知螢幕的解析度(大小) ?

2.8 怎樣在 Applet 中用某個圖形塗滿整個背景 ?

2.9 怎樣在 Applet 中建立自己的功能表 (MenuBar/Menu) ?

2.10 怎樣畫出比較粗的線條呢 ?

2.11 請簡單說明 application, applet 和 servlet 的差別 ?

2.12 平常我們用 Applet.add(Component) 來替 Applet 加入物件, 是否有方法設定這些物件的 z-order ?

2.13 Component 的 setForeground(Color c) 和 Graphics 的 setColor(Color c) 在用途上有何差異 ?

2.14 怎樣在程式中得到螢幕的相關資料 ?

2.15 怎樣才能知道 Frame 物件的標題列( title bar) 和邊框(border) 大小 ?

2.16 怎樣比較兩個資料型態為 String 的字串 ? if(s1 == s2) 好像有點怪怪的.

2.17 如何用鍵盤的 Tab 鍵在元件 (components) 之間切換 ?

2.18 安裝 JDK1.1.5 或 JDK1.2 時會將 Winsock 的版本更新, 連帶使一些 Internet 程式(如: Agent, Netterm ...)執行不正常, 有無解決之道 ? NEW!

2.19 何謂 JNI ? NEW!

3.1 請問有人會把一塊大圖形中的一小塊區域減下來嗎 ?

3.2 Java 如何列印?

3.3 Java 有沒有處理 HTML 的 package ?

3.4 為什麼 '對話視窗物件' (Dialogs) 總不對勁 ?

3.5 哪裡有 sun.* classes 相關的資訊 ?

3.6 要怎樣從 java 程式讀取環境變數 (Environment variables) ?

3.7 怎樣使用 Date 這個 class 來顯示時間 ? 為何 Date.toString() 在 JDK1.1 老是落在 PST 時區 ?

3.8 如何透過 Java 來存取 Microsoft Access 的資料 ?

3.9 Java 有沒有類似 C/C++ 的 scanf 和 sscanf 的東西 ?

3.10 Java 程式能否改變現行目錄 ?

3.11 如何讀入或輸出帶有格式的浮點數 ?

3.12 怎樣讀取指數 ?

3.13 當我在 Win95 按下標題列的關閉按鈕時, 為什麼 Java 程式不會結束 ? NEW!

4.1 RMI, CORBA , RPC, COM .. , 到底哪一個好?

4.2 在 Windows 上執行 Java 的時候, 如果沒連上 Internet 的話, 經常會停住達好幾分鐘 , 這是怎麼回事?

4.4 jdb 程式在 JDK1.1.1 , Window95 上執行的錯誤訊息.

4.5 假如有人正在使用我的 applet 程式. 而我想要傳個 class 檔案給他, 這樣可行嗎 ?

4.6 怎樣連結到一個透過代理伺服器 (proxy server) 的 URL(someURL) ?

4.7 怎樣用 Java 寫 proxy ?

4.8 怎樣從 Applet POST CGI script ? NEW!

5.1 如何將字串 String 轉換成整數 int ?

5.2 如何將整數 int 轉換成字串 String ?

5.3 如何對 PC 的串列埠作讀寫的動作 ?

5.4 如何從一個檔案的尾端新增資料 ?

5.5 怎樣送出一個函數的指標當作 argument ?

5.6 Java 程式中如何執行其他的程式? 使用了 exec() 之後, 要如何才能使用 I/O redirection ?

5.7 Java 有沒有辦法鎖住 (lock) 特定的檔案 ?

5.8 如何使 Java 程式發出鍵盤的嗶聲 ?

5.9 怎樣由鍵盤讀入 String/int/boolean/等等 ?

5.9a 怎樣判斷使用者按下的是滑鼠哪一個按鈕 ?

5.10 我在 Applet 裡頭使用 KeyListener , 但似乎接收不到 Keycode, 為什麼 ?

5.11 如何在 jdbc 印出中文 ?

5.12 使用 JDK 編譯器 javac 編譯時為何出現 "Statement not reached" 的錯誤訊息 ?

5.13 怎樣才能把 javac 編譯的結果轉向到其他檔案? javac > exitfile 好像根本沒用.

5.14 支援 Java 1.1 的瀏覽器(Browser)有哪些?

6.1 為何我的聲音檔無法從 Java 程式撥放出來 ?

6.2 Java 是否支援動態的 GIF 檔案格式 (GIF89)?

6.3 Java 如何撥放 vedio 檔 ?

6.4 怎樣在 Java 的 application 程式裡頭播放 *.au 的音樂檔 ?

7.1 請說明 Netscape Navigator 中取得 Applet 認證的步驟.

7.2 何處有 Java Security 相關的 FAQ ? NEW!

7.3 何處有 CORBA 及 IDL 相關的 Solution ? NEW!


0.0 哪裡可以找到 Java 書籍的相關資料?
A. http://lightyear.ncsa.uiuc.edu/~srp/java/javabooks.html

0.1 有無 JDK 1.1 的 bug list ?
A. 有, 在 http://java.sun.com/products/jdk/1.1/knownbugs/index.html
, http://www2.vo.lu/homepages/gmid/java.htm

0.2 C/C++ 的程式要如何轉換成 Java 程式 ?
A. 通常這並非易事, 主要是因為 Java 缺乏指標的緣故.
底下有一些資料可供參考:

               http://www.ist.co.uk (search for X-Designer 4.6: Java edition).
               http://members.aol.com/laffra/c2j.html
               http://www.ilog.com/
               http://www.cs.wustl.edu/~schmidt/java_notes.html

相對來說, Java 轉換成 C 就比較來得輕鬆,目前已知的幾個工具, 如:

- j2c from Japan,
- Toba from the Sumatra research project,
- JCC from Nik Shaylor.

也有 Visual Basic 轉成 Java 的工具, 請參考:
http://www.blackdirt.com http://www.tvobjects.com

至於 C/C++ 轉成 Java 的工具, 請參考:
http://members.aol.com/laffra/c2j.html
http://plato.cis.nctu.edu.tw/cpp2Java
http://www.ist.co.uk
http://www.ilog.com/
http://www.cs.wustl.edu/~schmidt/java_notes.html

0.2a Window3.1 有 Java 可用嗎 ?
A. 目前唯一可用的似乎只有 IBM 的ADK1.02 beta 3, 請參考:
http://ncc.hursley.ibm.com/javainfo/latest/answers/faq0.html
http://www.alphaworks.ibm.com/formula
瀏覽器部分, Netscape Navigator 從 4.02 起, Microsoft IE 從 3.0 起的十六位元版本都支援 Win3.1 的 Java.
或者您可以參考 JavaSoft 售價 $100 的新產品 - JavaPC, 將 PC 變成 thin client Java system 的工具程式.

0.2b 其他平台有 Java 可用嗎 ?
A. 目前為止, Java 已經 port 到 IBM OS/2, IBM AIX, IBM MVS, IBM OS/400, HP 3000, HP-UX, Digital/OSF, SGI, NextStep 等等機器上了, 詳細資料請參考:
http://java.sun.com/products/jdk/jdk-ports.html

0.3 有無 Java 寫成的 shell ?
A. 有的, 請參考 http://www.jsh.net/



1.0 我在編譯程式時得到底下的訊息, 到底發生了什麼事 ?

 ShowDate.java uses a deprecated API.  Recompile with "-deprecation"   for details.
 
1 warning

A. JDK 從 1.1 開始把許多 1.0x 的 method 取消掉了, 雖然編譯不會有錯, 但也不保 證執行結果是正確的. 目前大部分的 Java 書籍 (尤其是中文書 ) 所附的範例程式都是 for JDK1.0x 的, 照書行事難免會被一大堆 warning 搞得莫名其妙. 解決方法有二:

1). 回頭用 JDK 1.0x 去編譯.
2). 用 javac 編譯的時候加上 -deprecation 的參數, 那麼 javac 就會把您 '誤用' 的 method 名稱 列出來. 到 API 文件找出替代的新 method, 修改原始程式, 再重新編譯. 看起來很麻煩, 卻是斧底 抽薪之計 . 要不然只有戒急用忍, 等書改版了. 底下是一些有用的參考資料:
- JDK 1.1 API 文件.
- 如何將程式修改為 JDK1.1 的規格 ?
- JDK1.0x 的 Methods 更動明細



1.0a 我的 Java 程式改用 JDK1.1 編譯後, 為何出現 OutOfMemory 的錯誤訊息 ?
A. JDK1.1 的最低記憶體需求是 16Mb, 或者在執行時期調整之.
如: java -mx32m 程式名稱 相關資料請參考 freeMemory() 和 totalMemory() 這兩個 method 的說明文件.

1.1 為什麼我連像 "hello world" 這麼簡單的程式都無法順利執行?
A. 對一般 Java 初學者來說, 程式執行失敗的基本原因不外乎兩種:

1). 原始程式檔案名稱和 class 名稱需完全相同, 包括英文的大小寫.
例如您的 class 叫做 HelloWorld, 那麼程式檔名也要取成 HelloWorld.java 才行.

2). Java 需要靠 CLASSPATH 這個環境變數, 才能找到要執行的 class, 所以
CLASSPATH 必需包括現行目錄("."), 也就是您剛編譯好的 class 所在位置

1.2 如果 Java 沒有指標, 那我怎麼處理像 linked list 這樣的資料結構 ?
A. 一般人總以為 Java 沒有指標, 其實它只是缺乏指標的型別運算或轉換, (untyped casting). 指標的觀念則由 reference 來取代, 這樣不但使記憶體的管理 更安全, 同時也允許像底下的 linked list 動態資料結構:

      public class linkedlist {
          public linkedlist next;
          public static linkedlist head;
          public linkedlist next(linkedlist current) { ...
      ... }

另一種 linked list 結構的選擇, 是使用 java.util.Vector 來達成. 這個東西可 以儲存不定長度的物件, 取出物件的速度也很快, 詳細資料請參考 JDK API 文件.
http://www.javasoft.com/products/jdk/1.1/docs/api/packages.html

1.3 到底 Java 是如何傳遞參數的? 是 by value 或 by reference ?
A. All parameters (values of primitive types, and values that are references to objects) are passed by value [JLS sect 8.4.1]. 根據以上 Java 規格文件的說法, 所有參數 應該都是傳值的 (by value), 但很明顯地, 實際經驗卻告訴我們所有 Java 的物件是傳址的 . (by reference) 因此我們只能這樣解釋: 基本型別 (如 int, float, char 等) 是 by value , 而所謂"物件"(Object) 則是 by value of reference to object.

1.4 String 這個型別的 class 為何定義成 final ?
A. 主要是為了'效率' 和 '安全性' 的緣故. 若 String 允許被繼承, 由於它的高度被使用率, 可能會 降低程式的效能. 此外, 為避免網路上容易被侵入, 也是 String 定義成 final 的理由.

1.5 finalizers 和 C++ 的 destructors 有何差異?
A. Java 內部建置有 "記憶體使用回收" 的功能, 雖然它也提供了類似 (C++ 的) destructors 的 finalize(), 每個 Object 都可以使用這個 method , 但必須冒著破壞原先回收機制的危險. 建議對 finalize() 能閃就閃, 不妨考慮多使用 null 及 dispose() 來釋出資源會好一些?BR>?
1.6 "private protected" 這個修飾字為什麼不見了 ?
A. 早在 JDK 1.0 Beta 時代就取消了這個修飾字, 因為它的用處不大, 意思又含混不清, 乾脆就送它 到蘇州賣鴨蛋去了.

1.7 Java 裡頭有沒有 sizeof() 這樣的用法?
A: Java 不需要 sizeof() 這樣的用法, 主要基於三點理由:

1) Java 所強調的是可攜性, 因此它的基本型別都有固定的長度. 例如 char 一定是 16 bits , long 一定是 64 bites. C 和 C ++ 就不同啦, 要看落腳的平台 (platform) 而定. 因此 , sizeof(基本型別) 在 Java 便無用武之地了.

2) Java 的記憶體配置(allocate) 是隱含的, 程式設計師不需要(不能也不會 ??) 知道每個 物件在記憶體所佔的大小.

3) Java 缺乏指標的型別演算和轉換, 自然也就沒有引進 sizeof() 的必要.

1.8 我繼承了一個 class 叫做 Frotz, 編譯器卻給我 "No constuctor Frotz() in the class" 這樣的錯誤訊息, 為什麼呢 ?
A. 記住每當您定義了一個 class 的 constructor, 除非您一開始就去 call 這個 constructor, 否則 Java 會自動引入 superclass 原先不含參數的 construcuor. 如果 superclass 的 constructor 都是有參數的 , 那麼問題中的錯誤訊息便出現了. 解決的方法很簡單, 找一找 API 文件, 加上正確的參數就得了.

1.9 使用浮點運算時出現 [unexpected] , 為什麼?
A. 第一個可能的原因是, 浮點數的小數位數超過六位. 這在 JDK1.0 時代會有錯誤, 但是 JDK1.1 已經修正好了.
大致來說, Java 的 float 精確度約為 7 digits, double 則達 16 digits. ( 視 JVM 而定 ), 如果您需要 16 digits 以上的數值, 請用 JDK 1.1 的 BigInteger 或 BigDecimal 物件.

相關的文件請參考:
http://www.javasoft.com/products/jdk/1.1/compatibility.html#incompatibilities
http://www.javasoft.com/doc/language_specification/javalang.doc.html#1466
http://www.javasoft.com/doc/language_specification/javalang.doc.html#5899

1.10 以下程式片段編譯時為何錯誤 ?

     urltest.java:8: Variable test may not have been initialized.

     URL test; 
     try {
      test = new URL("http://osprey.avs.dec.com");
      } catch (MalformedURLException e) {}
      System.out.println("this is url " + test);
      }

A. 設定 test 的初值為 null, 或在 catch 敘述中印出 e.getMessage() .

1.11 為什麼編譯以下程式時出現錯誤 ?

   public static void main(String[] args)  {
       public static final float Conversion_Factor = 39.37; 
       ^
       Type expected.

A. (函數)內部的變數宣告不得使用 "public", "static", 或 "final" 這些修飾字. 最好把所有需宣告成 final 的變數都放到 class 開頭的位置.

1.12 怎樣讓字元 (char) 型態的東西轉換成整數 (int) 型態 ?
A.
char c = 'A';
int i = c;
//反過來只要作強迫型別轉換就行了,
c = (char) i;

1.12a 怎樣把 .class 的 bytecode 轉成原始程式檔 (.java) ?
A.
1.) 目前類似這種 '反向工程' 的產品有 H.P.van.Vliet 的 Mocha 和 Winsoft 的 WingDis .
其使用方法如下: (以 Mocha 為例)

假設您的 mocha-b1.zip 解壓縮後放在 d:\java\lib 裡頭, JDK 的 java.exe 在 d:\java\bin, 而準備要Decompiler 的 class 是 c:\logfiles\lc.class, 那麼只要底下兩道指令:

set  classpath =c:\logfiles;d:\java\lib
d:\java\bin\java   mocha.Decompiler   c:\logfiles\lc.class

會產生 lc.mocha, 將它 rename 成 lc.java, 就是您要的 source 檔了.

2.) 所謂 '天生萬物, 相輔相剋' , 底下就是用來對付上述程式的 'Java 防護盾':

- Crema - Mocha 的姊妹作.
- Java Obfuscator
-HashJava
- JOBE - The Java Obfuscator
- HoseMocha

某些 obfuscator 並不適用於 JDK1.1.x, 請特別注意.

3.) 這兒有一篇關於各種 Decompiler 的比較報告, 可參考看看:
http://www.javaworld.com/javaworld/jw-07-1997/jw-07-decompilers.html

1.13 我用 C 語言寫了支程式, 來建立一個二進位檔 (binary file). 但是當我想用 Java 的 DataInputStream 配合 readInt 去讀檔時, 所得到的數值卻是錯誤的, 為什麼呢 ?
A.
Java 處理位元組順序 (byte order) 的方式是和 Motorola, SPARC 等機器一樣. 採用 "高-低順序" (big-endian order) 的. 這和 Intel x86 的 "低-高順序" (little endian order) 恰恰相反.
因為一個 int 整數要佔掉 4 bytes, 當您在 Intel x86 機器上用其他非 Java 程式寫入檔案時, 請特別 考慮其順序(endian)問題.

1.14 怎樣產生 Java 看得懂的 .zip 格式的檔案?
A.
使用 JDK1.1(.x) 的 jar 工具程式 :

      jar [ options ] [manifest] destination input-file [input-files]

     E.g.: 'jar cvf  myJarFile.jar *.class' creates a compressed archive
           'jar cvfO myJarFile.zip *.class' creates it fullsize (uncompressed)
             (note the 'O'-option)

或者是像 WINZIP, PKZIP 這類的壓縮程式亦可.

1.15 一個一個重新編譯(recompile) class 檔好累, 有沒有比較好的方法?
A.
最簡單的方法是 javac *.java , 或者 javac -depend SomeSourceCode.java
此外, 如果您編譯的是最上層的 class (如 JavaBean 的 XXXBeanInfo class), 那麼相關的 class 也 會被抓進來重新編譯.

1.16 在 Linux 下如何設定 JDK 的 PATH ?
A. 參考下例:

export CLASSPATH=.:/usr/local/java/lib/classes.zip:/home/jhhuang/java/ifc11/cla
export JDK_HOME=/usr/local/java
export LD_LIBRARY_PATH=.
# export DISPLAY=203.71.127.21:0.0
export JAVA_HOME=/usr/local/java/
PATH=":/usr/local/java/bin:$PATH:$OPENWINHOME/bin/sunview"


1.17 如何解決 SwingSet 在 Win95 中環境變數過長的問題 ?
A.
1. 在 Config.sys 中加入這一行: SHELL=C:\WINDOWS\COMMAND.COM /p /e:2048
其中 2048 為新設定的環境變數總長度.

2. 將滑鼠游標移至 MSDOS Command icon, 按下滑鼠右鍵, 選擇快顯功能表的'內容',標籤為'記憶體' 的選項中有一個叫做 '傳統記憶體的起始環境', 請將這個數字加大, 直到不再出現錯誤訊息為止.

1.18 為何執行含有原生方法 (Native Method) 的程式時會出現 java.lang.UnsatisfiedLinkError 的錯誤訊息 ?
A.
這表示被呼叫的 (原生) library 或 DLL 檔不在執行路徑之中. 如果您在 Win95/NT 系統下, 請將原生檔的路徑 加入 PATH 環境變數. 如果是 Solaris 系統, 則加入到 LD_LIBRARY_PATH 環境變數.

1.19 怎樣清除 TextArea 物件的內容 ?
A.
填入空白的字串, 例如: area.setText("");

1.19a TextArea 物件裡頭可容納多少字元?
A.
實作上來說, TextArea 都是使用各式 Window 系統現有的 widget 來完成的, 當然容量的限制也來自那兒. 以 Win95 而言, 這個數字大約是 24Kb, 其他 widget 約 32Kb 左右.

1.19b TextArea 物件裡頭能否針對不同的文字作字型上的變化 ?
A.
不行, 但是可以用 Canvas 來達到您的目的.

1.20 怎樣用十六進位表示一個整數呢 ?
A. 請參考下例:

        int i = 0xf1;
        System.out.println("i is hex " + Integer.toHexString(i) );




2.1 我的 applet 原先好好的, 一放到 web server 就會有問題, 為什麼 ?
A. 一般來說, 網路程式設計的問題很難偵錯, 您可以從幾個方向試試:

1). 確定 class 檔案的格式沒錯 - 已經編譯過, 也沒有損壞的情形.

2). 確定所有用到的 class 檔案都放到 web server, 少一個都不行.

3). 確定所有的檔名和 class 名稱一致. 特別檢查大小寫有無差錯.

4). 如果程式中用到 package, web server 上的目錄就要當心了. 譬如您在 class 中宣告了 一個叫 COM.foo.util 的 package, 那麼 web server 的 applet codebase 目錄底下就非得有 COM/foo/util 這個子目錄不可. (注意目錄名稱也有大小寫之分)

5). web server 上的檔案權限需事先設定好. (尤其是 search, read 與 execute 權限)

2.2 為什麼在 JDK 1.1 under X Windows 會出現底下的錯誤 ?

     java.lang.NullPointerException
         at sun.awt.motif.MFramePeer.(MFramePeer.java:59)
         at sun.awt.motif.MToolkit.createFrame(MToolkit.java:153)
         at java.awt.Frame.addNotify(Frame.java)
         at java.awt.Window.pack(Window.java)

A. 這是字型方面的問題, 把 lib 目錄中的檔案名稱 font.properties 改成 font.properties.bak 就可解決.
注意; Java 的內定字型為 "plain Dialog 12 point", 真正字型的樣子則視執行平台而定, 如果您用Toolkit.getDefaultToolkit().getFontList() 去取得系統所有字型, 在中文 Win95 的環境下有 Dialog, SansSerif, Serif, Monospaced, Helvetica*, TimesRoman*, Courier*, DialogInput, ZapfDingbats* 等九種. (標記 * 者無法顯示中文)

2.3 如何使 applet 的背景呈現 '透明'(transparent) 狀態 ?
A. Java 不提供此一功能. 但 JDK1.1 起所有的 Lightweight components 都具有 "透明" 的背景.

2.4 如何在 applet 中讀寫檔案 ?
A. 由於 security 的緣故, Applet 讀寫檔案必須和 Server 端的程式搭配, 先說明 Server 端可能的做法;

1. ) 使用 URL 物件, 經由 openStream() 便可得到 inputStream 物件來讀檔, 但此一方法不允許寫入檔案.
2.) 使用 socket 物件, 經由 getInputStream() 便可得到 inputStream 物件, 經由 getOutputStream() 可得到 outputStream 物件.
3. ) 透過遠方主機上的 CGI script 或 servlet 來達到目的. 請參考
? ftp://ftp.oyster.co.uk/pub/java/fileIO/ 的範例.
4.) 透過像 JDBC, RMI, JavaBeans, Active X ...等機制.

至於 Client 端的 Applet 必須獲得 trusted 等級或允許讀寫檔案的 Security 權限 , 兩者都和 JVM 的 security policy 有關. 詳情請參照 JDK Guide 文件說明.
http://www.javasoft.com/products/jdk/1.1/docs/guide/security/index.html

2.5 如何在 java application 讀寫中文文字檔 ?
A. JDK1.1.x 新增的機制之一是 Character Stream, 專門用來處理 Unicode 的問題. java.io.Reader 和 java.io.Writer 便是這種 class, 範例如下;

    BufferedReader  br = 
                           new BufferedReader(new InputStreamReader( 
                           new  FileInputStream("YourInputFile")));
   String inputString= br.readLine();
   ..................
   ................
   PrintWriter pw=
                      new PrintWriter(new FileOutputStream(
                       "YourOutputFile"));
   pw.println(outputString);
   ..........
   ...........

最後請記得將 InputStream, OutputStream, PrintWriter 的物件 close 掉

2.6 GridBagLayout 很不好懂, 怎麼辦?
A. 使用其他的 Layout, 或改用 RAD 工具 (像 Visual Cafe, Jbuilder, VisualAge for Java .. 等等) 來寫程式. 目前 JFC preview version, SwingSet 引進的 SpringLayout" Springs & Struts style layout manager 或許會在 JDK 1.2 出現, 屆時將取代彆扭難用 的 GridBagLayout

2.7 如何得知螢幕的解析度(大小)?
A. Toolkit.getDefaultToolkit().getScreenSize()

2.8 怎樣在 Applet 中用某個圖形塗滿整個背景?
A. 在背景建立 Panel 或 Canvas, 然後用圖形填滿它.

2.9 怎樣在 Applet 中建立自己的功能表 (MenuBar/Menu) ?
A. 在 Applet 的 init() method 建立 Frame instance, 然後將Menus, Menubar 都 add 上去即可. (setMenuBar() 是 Frame 下的 method) 或者, 找到 Applet 上層的 Frame 後依法炮製.

        Container parent = getParent();
        while (! (parent instanceof Frame) )
                parent = parent.getParent();
        Frame theFrame = (Frame) parent;
    

第二個方法在 Mac 或某些 browsers 上並不可行.
如果您使用的是 JDK 1.1, 也可以考慮使用 popup menu, 這樣就不必理會 Frame 的問題了.

2.10 怎樣畫出比較粗的線條呢 ?
A. JDK 1.1.1 不支援這個功能. 一般都是用 filled polygon 來取代. 不過倒是有一些現成的 class 可供參考:
http://www.apl.jhu.edu/~hall/java/GraphicsUtil.html
It extends the drawxxx and fillxxx methods of java.awt.Graphics. It adds a Line Width argument to most of the drawxxx methods, a Color argument to most of the drawxxx and fillxxx methods, and a Font argument to draw String and drawChars.

2.11 請簡單說明 application, applet 和 servlet 的差別 ?
A.
Application: 可單獨執行的程式, 就像平常您使用的程式一般.

Applet: 可經由網路下載, 且必須在 web 瀏覽器 (browser) 上執行的程式. 通常為了安全性起見, 這種程式在用戶端 (client side) 作存取動作時, 會受到 許多限制. 一般來說, applet 與 application 主要的差別在於 1). 程式進入點不同, 前者必定從 init() 開始執行, 後者則是以 main() 為起始點. 2). applet 有 trusted 和 sercurity 的問題, application 則無. 3) 執行的虛擬機器程式 (JVM) 不同.
一個 applet 可以同時具有 application 的身分, 只要在該applet 的 class 裡頭 加上這一段:

    public static void main(String arg[]){
        Frame f= new Frame("applet 的視窗抬頭");
        applet的class名稱  myApplet= new applet的class名稱();
    
        f.setSize(applet的視窗寬度, applet的視窗高度);  // JDK1.0x 需使用 resize(...)
        f.add("Center",  myApplet);
        f.setVisible(true);                            //  JDK1.0x 需使用 show()
        myApplet.init();
        myApplet.start(); 
    }
    

至於哪些是 applet 不能做的事情, 請參考 JDK API 有關 security 的文件: http://www.javasoft.com/products/jdk/1.1/docs/guide/security/index.html

Servlet: 專門用在 web 伺服端 (server side) 的應用程式. 它的用途類似 CGI , 只不過是用 Java 寫成的. 目前支援 servlet 的 web server 已有 Java Web Server, Netscape Enterprise Microsoft IIS, Apache 等數種, 請參考: http://u5321007.csie.ncnu.edu.tw/research/project/199706.1/index.html (中文)

我們可以使用 servlet 和 applet 互相溝通 (透過 socket), 完成一些 applet 做不到 的事情, 例如: 寫入檔案, 或連結到其他伺服器等等.

2.12 平常我們用 Applet.add(Component) 來替 Applet 加入物件, 是否有方法設定這些物件的 z-order ?
A. 目前 JDK 1.0 沒有類似的功能, 或許您可以試著用 CardLayoutManager 來模擬它.
至於 JDK 1.1 提供了 add(Component comp, int index) 這樣的 method 來作為 z-order 的設定之用. 其中 index 可從 0 到 N.

2.13 Component 的 setForeground(Color c) 和 Graphics 的 setColor(Color c) 在用途上有何差異 ?
A. 首先, 兩者都可以用指定的參數設定前景色, 差別在於使用時的場合.

如果您想在 constructor 或 event handler ( 例如: mouseClicked) 之中讓某個 componect 改變顏色, 那麼您應當使用 setForeground() 這個 method. 但是若您正在 paint() 裡頭, 那麼就只能使用 g.setColor(c) 了.
Graphics 物件與大多數 Java 元件不同的是, 無法單獨變換它的前後景顏色, 因為它的顏色是從其 圖板( drawing surface) 繼承而來的. 不管是 drawLine(), drawRect(), 或 fillOval() 等繪圖 method, 都只能拿這個顏色塗繪在圖板上.

正因為兩者有這樣大的差異, 所以才用不同的 method 來區分它們, 對 programmer 來說未嘗不是件好事
.
2.14 怎樣在程式中得到螢幕的相關資料 ?
A.
1. 解析度:
java.awt.Toolkit.getDefaultToolkit().getScreenSize() 或 java.awt.Toolkit.getDefaultToolkit().getScreenResolution()
其中 Screen resolution 以 dots-per-inch 表示.

2. 顏色數:
Math.pow(2,Toolkit.getDefaultToolkit().getColorModel().getPixelSize())

2.15 怎樣才能知道 Frame 物件的標題列( title bar) 和邊框(border) 大小 ?
A. 使用 MyFrame.getInsets(). 我們可以從傳回的 Insets 物件得到 Insets.top, Insets.left, Insets.bottom, Insets.right, 等四個代表像素 (pixels) 的整數, 自然也就知道標題列( title bar) 和邊框(border) 的大小了.

2.16 怎樣比較兩個資料型態為 String 的字串 ? if(s1 == s2) 好像有點怪怪的.
A. 在兩個物件之間使用 "==", 會將 "兩個物件是否有同一 reference" 的結果傳回. 也就是說, 這等同於 "兩個物件是否擁有同一位址 (address)", 或 "兩個物件是否為同一物件".
如果您的意思是要判斷兩個字串的內容是否相同, 那麼應該使用以下的 method 才對:

    
        if (s1.equals(s2) )
    or  if (s1.equalsIgnoreCase(s2) )
    or  if (s1.startsWith(s2) )
    or  if (s1.endsWith(s2) )
    or  if (s1.regionMatches(s1_offset, s2, s2_offset, length) )
    or  if (s1.compareTo(s2) <0) 
2.17 如何用鍵盤的 Tab 鍵在元件 (components) 之間切換 ? A. 若您使用 JDK 1.0, 必須自己處理切換的動作. 若使用的是 JDK 1.1, 則 Tab 及 Shift-Tab 都能自動發生作用. Tab 切換的順序依照元件加入 container 的先後而定. , 2.18 安裝 JDK1.1.5 或 JDK1.2 時會將 Winsock 的版本更新, 連帶使一些 Internet 程式(如: Agent, Netterm ...)執行不正常, 有無解決之道 ? A. 到 windows\system 下,執行 ws2backup.bat 即可. 2.19 何謂 JNI ? A. JNI 全名為 Java Native Interface, 是定義 Java 程式如何呼叫 C 程式的一種方法. 這份規格已成為公開的標準. 而微軟則另行推出了一份叫做 Raw Native Interface (RNI) 的規格, 其呼叫的方式比較接近 JDK1.0x 之所以制訂 JNI 的目的在於: 1. 規定一組可跨越平台的原生應用程式介面 (native API), 不管在何種作業系統底下, 寫作 JNI 的基本步驟都是一樣的. 2. 在同一平台裡頭, 原生碼不必重寫, 即可在各種虛擬機器 (JVM) 執行.

3.1 請問有人會把一塊大圖形中的一小塊區域減下來嗎 ? 

 A. 
 可以使用 java.image.CropImageFilter 來作.

ex.   
public Image getSubImage(Image image,Rectangle r){
  CropImageFilter filter=new CropImageFilter(r.x,r.y,r.width,r.height);
  return getToolkit().createImage(new FilteredImageSource(image.getSource(),filter));      
}
3.2 Java 如何列印? 


A.  使用 Toolkit.getPrintJob() , 例如: 

      PrintJob pj = getToolkit().getPrintJob((Frame) parent, "test", null);
      Graphics pg = pj.getGraphics();
      printAll(pg);
      pg.dispose();
      pj.end();
上例只限 JDK 1.1. ,  至於 JDK 1.0.x 的使用者可考慮 Jentec's JENI. 
    (The Java Enterprise Network Interface).  列印的範例請見 . 
    http://www.jentec.com/live/jeni/PrintingAFile.html



3.3 Java 有沒有處理 HTML 的 package ? 


A.  沒有, 您可以試著到  
    http://www.gamelan.com, 
    http://yahoo.com, 或 

    
    http://homepage.interaccess.com/~cdavis/java/java.htm  找找看.



3.4 為什麼 '對話視窗物件' (Dialogs) 總不對勁 ? 


A.  的確, Modal dialogs 在 JDK1.0x 時代總是少了根筋似的,  
 這個問題到了 JDK1.1 總算是解決了. 

 如果您的 Dialog 物件十分鐵齒, 不肯乖乖地關閉, 可以試試這兩行指令:

    setVisible(false);
    dispose();
 3.5 哪裡有 sun.* classes 相關的資訊 ? 


A.  
    很難拿到. 事實上, 這些 classes 並非正規 API 的一部份. 或許您曾經
    看過相關的 API 文件, 甚至有些人的程式還用過它, 但那些都是反向
    工程(reverse engineering) 的成果. 更糟的是, 誰都不能保證其可攜性
    , 這對 Java 程式來說, 可是一件天大的悲劇. 

    如果您仍然堅持要使用這些 classes, 請參考下列網址:
    
    http://java.sun.com/products/api-overview/index.html
    http://www.parmly.luc.edu/javaudio/
    http://www.users.interport.net/~mash/javamidi.html
3.6 要怎樣從 java 程式讀取環境變數 (Environment variables) ? 


A.  Java 不支援環境變數, 因為它們是不具可攜性的. 不過, 
    您可以用 Property 來取代它. 例如, 
    
            java -Dfoo=$foo MyClass       (Unix)
     或   
            java -Dfoo=%foo% MyClass      (MS-DOS)
3.7  怎樣使用 Date 這個 class 來顯示時間 ? 為何 Date.toString()  在 JDK1.1 老是落在 PST 時區 ?  

A.  有關時間的部分在 JDK1.1 做了很大的更動, 以 Date() 這個 class 來說, 就
 取消了一些很好用的 Constructor 和 Method, 不過大致而言, 都可以配合SimpleDateFormat 
 和 GregorianCalendar 來取代原先的功能. ( 譬如; 用 GregorianCalendar.setTime, 和 
 GregorianCalendar.get(Calendar.HOUR_OF_DAY) 來取代 Date.getHours 等等.)


 現在來回答上面的問題, 
   
1). 請參考下例:
    public String toGMTString() {
        DateFormat formatter
            = new SimpleDateFormat("d MMM yyyy HH:mm:ss 'GMT'",
            Locale.US);
        formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
        // + 1 is to work around bug in GregorianCalendar
        // XXX - need FIX
        // should probably be formatter.format( this );
        return formatter.format( new Date(getTime() + 1) );
    }
2). 為了偵錯容易使然.



3.8  如何透過 Java 來存取  Microsoft Access 的資料 ?  


A.  
    使用 JDBC-ODBC bridge 介面即可.  但 client 端必須有 sun.jdbc.odbc.JdbcOdbcDriver 的 class, 且設定好 ODBC
    的 Data Source 才行.  JDBC-ODBC bridge 及範例可自 
    ftp://leica.ccu.edu.tw/pub4/java/jdbc/jdbc-odbc-12001.zip取得. 
   
     詳細步驟請參考 JDBC 官方文件或 van der Linden 先生的大作 "Just Java 2nd Ed.". 

    JDBC 相關的 FAQ 則請連到  
     http://www.yoyoweb.com/Javanese/JDBC/FAQ.html 

     

3.9  Java 有沒有類似  C/C++ 的 scanf 和 sscanf 的東西 ?

A. 只能用 java.util.StringTokenizer 來模擬. 




3.10 Java 程式能否改變現行目錄 ?
 

A.   不行, 縱使您修改了 user.dir 這項 property 也無濟於事. 希望下次新的版本能加入此一功能.



3.11 如何讀入或輸出帶有格式的浮點數 ? 

 A.  
          目前寫得較周全的程式碼位於 
          http://www.apl.jhu.edu/~hall/java/CoreJava-Format.html 
.


3.12 怎樣讀取指數 ? 
         
 A.  
          底下是由 Steve Chapel 先生撰寫的一段程式碼:?
               import java.io.*;

               public class ReadExponential {
                   public static void main(String argv[]) {
                       DataInputStream in = new DataInputStream(System.in);
                       StreamTokenizer st = new StreamTokenizer(in);
                       try {
                           while (st.nextToken() != StreamTokenizer.TT_EOF) {
                               switch (st.ttype) {
                               case StreamTokenizer.TT_NUMBER:
                                   double num = st.nval;
                                   int exp = 0;
                                   st.ordinaryChars('\0', ' ');
                                   st.nextToken();
                                   st.whitespaceChars('\0', ' ');
                                   if (st.ttype == StreamTokenizer.TT_WORD &&
                                       Character.toUpperCase(st.sval.charAt(0)) == 'E') {
                                       try {
                                           exp = Integer.parseInt(st.sval.substring(1));
                                       } catch (NumberFormatException e) {
                                           st.pushBack();
                                       }
                                   } else if (st.ttype <0 || st.ttype> ' ')
                                       st.pushBack();
                                   System.out.println("Num  " + num * Math.pow(10, exp));
                                   break;
                               case StreamTokenizer.TT_WORD:
                                   System.out.println("Word " + st.sval);
                                   break;
                               default:
                                   System.out.println("Char '" + (char) st.ttype + "'");
                                   break;
                               }
                           }
                       } catch (IOException e) {
                           System.out.println("IOException: " + e);
                       }
                   }
               } 
 
3.13 當我在 Win95 按下標題列的關閉按鈕時, 為什麼 Java 程式不會結束 ?

A.  請在程式中加入底下的程式碼:
          JDK 1.0.2: Handle Event.WINDOW_DESTROY to do a hide() and
          dispose() on the Frame.

          JDK 1.1:
          a) Listen for WindowEvent and do hide(); dispose(); in
          windowClosing() - this really ought to be the "default" behaviour.

          b) enable AWTEvent.WINDOW_CLOSING and do the hide() and dispose()
          in processWindowEvent().
        

4.1 RMI, CORBA , RPC, COM .. , 到底哪一個好?  

A.  
    如果您的程式以 Java 為主, 建議使用 RMI, 否則就用其他的網路物件機制. 
    RMI (Remote Method Invocation) 可以做什麼呢 ? 它可以讓 Java 物件 
    以傳值的方式在網路上流通, 同時保有 Java 的優點, 如記憶體自動回收, 
    serialize,  reflection 等等. 當然, 為了兼顧網路的安全性, RMI 也建立了 
    (客戶端的) stub 和 (伺服端的) skeleton 這兩種 layer, 來辨認(或過濾) 
    各種不同的 request . (有點像 proxy, 不是嗎 ?)

    如果您曾經寫過, 或看過任何一個 Java 程式從編輯到執行的過程,  那麼您應 
    該知道, Java 需要靠 CLASSPATH 這個環境變數, 才能找到要執行的 class.   
    不過, 這只是最原始的 class 載入方式而已. 另一種是當我們從遠端 web server 載入 
    applet 時, 在 HTML 檔案裡頭 APPLET CODEBASE=??? 標記所指定的 URL,  
    也可以拿來當作載入 Class 的來源, 此稱之為 AppletClassLoader. 最後, 是一種叫做 
    動態載入(類似 RPC 的  Dynamic Class Loading)的 架構 , 稱之為 RMIClassLoader. 

    這個架構會依照以下順序來找到我們需要的 class: 
 

    1). 本地端定義之 CLASSPATH 所指定的路徑.

    2). 對那些被當作參數或傳回值的物件, 使用 marshal stream 中的 URL 
    來搜尋. (stream 裡頭包含了許多 serialized object). 

    3). 對本地虛擬機器遠端物件所產生出來的 stubs 和 skeletons, 則使用 
         java.rmi.server.codebase 所指定的 URL 來搜尋. 


    其中第二, 三項利用到所謂 bootstrapping 的技巧, 中文不知如何翻譯, 姑且翻成 "飛鳥盡, 
    良弓藏". 什麼意思呢 ? 就是先使用目前的  ClassLoader 載入要用的 RMI (或 stub) 程式, 
    再用新的 ClassLoader 取代原先的, 如此循環不息. 詳細的步驟和相關資料請參閱 
    JDK1.1 的 RMI Guide 文件. 
 
    
    http://www.javasoft.com/products/jdk/1.1/docs/guide/rmi/index.html 
      
    

4.2 在 Windows 上執行 Java 的時候, 如果沒連上 Internet 的話, 經常會停住達好幾分鐘 , 這是怎麼回事? 

A.  
     Java (VM) 內建網路, 執行時期也會自行啟動 winsock.dll , 進而連結 
     到 DNS 去查詢 IP, 因此畫面上就會出現 '撥號網路' 的視窗 , 或者一直 
     嚐試作連接網路的動作, 一直到連線失敗為止. 要解決這個問題, 可以把 
     自己完整的 domain name 加入 hosts 檔案中, 就像這樣:

     
             127.0.0.1  localhost
    改成
             127.0.0.1  goober.best.com    localhost
     

     

4.4 我的 jdb 程式在 JDK1.1, Window95 底下執行沒有問題, 換成 JDK1.1.1 後就會出現錯誤訊息:
    "Uncaught exception: java.lang.UnsatisfiedLinkError no winawt  in shared library path", 為什麼?


A. 
    表面上好像是找不到 winawt.DLL 這個動態程式檔, 但其實有可能是因為  
    Sun 在作某些 _g code 連結時, 需要用到 MSVCRTD.DLL 的關係. 您可以 
    把它加到 Window95 的 system 目錄, 或 Java 的 bin 目錄試試. 

    
     

4.5 假如有人正在使用我的 applet 程式.  而我想要傳個 class 檔案給他, 這樣可行嗎 ? 


A. 
   您可以把該 class 檔案壓縮成 ZIP 的格式, 配合 URL 的  showDocument() 這個 method.  當使用者
   執行您的 applet 程式時, 就會出現要求下載檔案的視窗, 或者您可以去看看底下的例子:
  
   
    http://www.best.com/~rmlynch/saveit.html 


     

4.6 怎樣連結到一個透過代理伺服器 (proxy server) 的 URL(someURL) ? 


A.  定義執行時期的 property 即可, 如:
    
    java -DproxySet=true -DproxyHost=proxy_host -DproxyPort=proxy_port \
                        MyJavaProgram
    
請注意 proxyPort 是代理伺服器的埠號, 內定值為 80.   
 
     

4.7  怎樣用 Java 寫  proxy ?  

A. 
如果是寫最簡單的proxy的話,不必管它是什麼MIME物件,
反正通通relay過去就好了。

先從client端接收request,再將request送到指定的server去;
接著從server端接收response,轉送給client,
然後就將接下來的物件邊收邊轉送給client就好了,不必理會它的資料形態。

要做的只有收到request時,要將request中的request line轉一下形式而已。
詳情請參閱RFC1945(HTTP 1.0)。  
 

     

4.8 怎樣從 Applet  POST CGI script ? 
 
 A.  試試底下這段程式碼. 需要注意的是, 若這個 Applet 屬於 untrusted, 那麼
          CGI script 就非得放置在 (與Applet) 同一 Server 端不可.
               try { sock = new Socket(host, 80);
               dock = new DataOutputStream(sock.getOutputStream());
               dock.writeBytes("POST "+cgiloc+" HTTP/1.0\n");
               dock.writeBytes("Content-type: text/html\n");
               dock.writeBytes("Content-length: " +my_string.length() + "\n\n");
               dock.writeBytes(my_string+"\n");
               dock.close();
               sock.close();

               uresp = new URL(getDocumentBase(),"respond.html");
               getAppletContext().showDocument(uresp); }
The my_string contains the data you want to POST to the CGI
          script. The string should be encoded in the special way CGI
          expects. The class method java.net.URLEncoder.encode(my_string)
          will do it.

          If you request a url via the URLConnection/HttpURLConnection, the
          server sets the content type, and your applet can use
          URLConnection.getContentType() to get the type. Alternatively, use
          setRequestProperty to set it, like this:
               url = new URL(cgiUrl);
               urlc = url.openConnection();
               urlc.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
        

5.1 如何將字串 String 轉換成整數 int? 


A. 有兩個方法:


1).  int i = Integer.parseInt([String]);  或 

       i = Integer.parseInt([String],[int radix]);


2).   int i = Integer.valueOf(my_str).intValue(); 



   註:  字串轉成 Double, Float, Long 的方法大同小異.  



5.2 如何將整數 int 轉換成字串 String  ? 


A.    有三種方法:


1.)  String s = String.valueOf(i);


2.)  String s = Integer.toString(i); 


3.)  String s = "" + i; 

 

註:  Double, Float, Long 轉成字串的方法大同小異.  



5.3 如何對 PC 的串列埠作讀寫的動作 ? 


A.  假如這個串列埠已經有了 pathname, 就可以把它當成檔案來讀寫. 
    但是若要直接改變串列埠的 baud rate, parity 等, 目前 Java 還無法辦到. 

    有家公司發展了一些 library 來幫 Windows 95, NT, OS/2 使用者達到這個 

    目的. 網址是 http://www.sc-systems.com



    如果您對 Java 在通訊方面的應用感興趣, 也可以到 Sun 的 Java Telephony API 

    (JTAPI) 頁面 
    http://www.javasoft.com/products/jtapi/index.html

    抓些資料回來看看.

       

5.4 如何從一個檔案的尾端新增資料? 


 A.  有兩種方法:

1).
        RandomAccessFile fd = new RandomAccessFile(file,"rw");
        fd.seek(fd.length());
然後使用 fd 的 method 寫入. 


2). 使用 FileOutputStream(String name, boolean append) throws IOException 這個 constructor.




5.5 怎樣送出一個函數的指標當作 argument? 

 A.  
    答案是: 使用 "callback".  先建立一個參數的 interface, 再將 implements 這個
    interface 的 argument 實體化後送出.  
    
    public interface CallShow { public void Show( ); }

    public class ShowOff implements CallShow {
	public void Show( ) { .... }

    public class ShowMe implements CallShow {
	public void Show( ) { .... }
	
    public class UseShow { CallShow callthis;
	UseShow( CallShow withthis ) { callthis = withthis; }
	void ReadyToShow( ) { callthis.Show( ); }

   // in some other class that uses all this stuff:
	UseShow use_1 = new UseShow( new ShowOff() );
	UseShow use_2 = new UseShow( new ShowMe() );
     
   and then the ReadyToShow() method on use_1 or use_2 will
   call the appropriate method, as if you had stored a pointer
   to the method.
   
5.6 Java 程式中如何執行其他的程式?  使用了 exec() 之後, 要如何才能使用 I/O redirection  ? 


A.   底下是 Unix 的例子, DOS 或 Window 系統也可以依樣畫葫蘆:
     import java.io.*;
     import java.util.*;
      
     class IoRedirect {
         public static void main(String Argv[]) {
             try {
                 String[] command = {"/bin/sh", "-c", "/bin/ls > out.dat"};
                 Process p = Runtime.getRuntime().exec(command);
                 p.waitFor();
                 System.out.println("return code: " + p.exitValue());
             } catch (IOException e) {
                 System.err.println("IO error: " + e);
             } catch (InterruptedException e1) {
                 System.err.println("Exception: " + e1.getMessage());
             }
         }
     }
5.7  Java 有沒有辦法鎖住 (lock) 特定的檔案 ?  


A.   Java 不支援直接鎖住檔案的指令. 我們只能用下列三種方法來模擬: 


     1. ) 使用 synchronized methods. (參考 Reader 與 Writer 的 lock 物件)

     2. ) 建立 "file delete" 的專用協定, 並讓所有程式 (不管是否用 Java 寫成) 
           都遵守這個協定. 一旦擁有此一檔案的鎖定權, 便可先加以刪除, 直到開鎖 
           後才還原此檔案. 

     3. ) 呼叫 native 程式來達到鎖檔的目的. 
 


5.8  如何使 Java 程式發出鍵盤的嗶聲?  


A. 
     在 JDK 1.1 當中可使用 java.awt.Toolkit 的 method beep(), 不過這個方法   
     對 Windows NT 4.0 無效 (bug). 



5.9  怎樣由鍵盤讀入 String/int/boolean/等等?  


A. 
     以字串來說,

     
     In JDK 1.0.2
     java.io.DataInputStream in = new java.io.DataInputStream(System.in);
     String s = in.readLine();

      in JDK 1.1
     java.io.BufferedReader in = new BufferedReader(new java.io.InputStreamReader(System.in));
     String s = in.readLine();
     
其他型態可以由字串轉換而成, 或用類似的 method 讀取. 



 5.9a 怎樣判斷使用者按下的是滑鼠哪一個按鈕 ?   
     
A.    請參考底下這個例子:
    public void mouseClicked(MouseEvent e) {
    
            if(e.getModifiers()==MouseEvent.BUTTON1_MASK){
	   System.out.println("您按了滑鼠第一個按鈕!");
            }
            if(e.getModifiers()==MouseEvent.BUTTON2_MASK){
	   System.out.println("您按了滑鼠第二個按鈕!");
            }
            if(e.getModifiers()==MouseEvent.BUTTON3_MASK){
	   System.out.println("您按了滑鼠第三個按鈕!");
            }
   } 
   
通常第一個按鈕指的是用來 "選擇" 的按鈕, 第二, 三個按鈕則視不同的平台而定,
   有些系統並不提供這兩個按鈕給使用者, 因此程式設計者必須謹慎地考量到這兩個按鈕缺席的
   場合.
  


 5.10 我在 Applet 裡頭使用 KeyListener , 但似乎接收不到 Keycode, 為什麼 ?  
  
A.  Applet 加上   this.requestFocus() 試試.



5.11 如何在 jdbc 印出中文 ? 

 A. 1. 第一個方式:  以 Java Applet -> socket -> Java Application -> database 為例:
  byte[] buff = new byte[512]; //buffer size 隨你高興.
  Socket sock = //這裡做 socket 的初始化工作 ..

  ResultSet rs = //這裡做 ResultSet 的初始化工作 ..
  DataOutputStream dataout = 
        new DataOutputStream(new BufferedoutputStream(sock.getOutputStream()));
  InputStream in = rs.getAsciiStream(column_index); //column_index = Column number.

  for (;;) {

     int size = in.read(buff);
     if (size == -1) break;
     dataout.write(buff, 0, size);
   }
  dataout.flush();
這樣就能把中文送過去.


  2. 第二個方法: 把第六行改成 
 
   InputStream in = Runtime.getRuntime().getLocalizedInputStream(
                                 rs.getAsciiStream(column_index)) 試試. 
 

  3. 因 getLocalizedInputStream() 在 JDK1.1 已成為 deprecated method, 有可能不再
      適用於以後新的 JDK 版本. 建議改用 BufferedReader 取代之.

                                     
      例如: BufferedReader  br = 
                           new BufferedReader(new InputStreamReader( 
                                   rs.getAsciiStream(column_index)));   
                        


5.12  使用 JDK 編譯器 javac 編譯時為何出現 "Statement not reached" 的錯誤訊息 ?  


A. 
    JDK1.0 有個很糟糕的限制, 每一 method 所有的區域性變數儲存空間
    加起來不得超過 63 words. ( 譬如 long 和 double 要佔掉 2 words, 
    其餘的基本型態變數均佔 1 word ) . JDK1.1 已經去掉這個限制了.
 


5.13  怎樣才能把 javac 編譯的結果轉向到其他檔案?  javac > exitfile 好像根本沒用. 

      
A.  
  試試這個方法:

     javac -J-Djava.pipe.output=true source.java >errors 




 5.14  支援 Java 1.1 的瀏覽器(Browser)有哪些?   


A.  
    Netscape Communicator 4.0 支援大部分 Java 1.1 的新增功能, 唯獨漏了最重要的
    new Event model 和 Beans . 預計 97' 十月底前會推出完整的版本, 屆時可能會使用
    '智慧型下載更新' 的技術, 救救 modem族可憐的荷包 . 相關消息請參考:

    
    http://developer.netscape.com/support/faqs/champions/java.html#21


    
    當然了, Sun 自家的 HotJava 瀏覽器是完全支援 JDK 1.1 的.

?

    至於 Microsoft 的 Internet Explorer 4.0 , 預計在 97' 十月底前會推出支援 JAVA 1.1完整的版本,
    但不支援 RMI, JFC, JNI, JAR 等這些較 '敏感' 的玩意兒, 詳情請參考:

    
    http://www.microsoft.com/ie/ie40/browser 
    
    


6.1 為何我的聲音檔無法從 Java 程式撥放出來 ? 


A.  
    到目前 (JDK1.1.1) 為止, Java 只能接受一種聲音檔格式; mono, 
    以 8KHz錄製, 用 mu-law 編碼, 附屬檔名為 au 的聲音檔. 其他種類
    則一律拒絕. 您只能用一些工具程式來把它們轉成正確的格式, 這類 
    工具比如像 Win95 的 GoldWave, Unix 的 sox 等等. 或者您也可以到
    底下的網址取回一個 Java 寫成的轉換工具: 

    
    http://saturn.math.uaa.alaska.edu/~hursha 

    

6.2  Java 是否支援動態的 GIF 檔案格式 (GIF89)?  
 

A. 
    Java 1.0.2 及早期的版本只認得 GIF 和 JPEG 兩種圖形檔.  JDK1.1 
    起增加了 GIF89 的動態格式, 程式設計師要用 Java 來展示動畫也就 
    輕鬆多了. 



6.3 Java 如何撥放 vedio 檔 ?  


A. 
    好消息! 現在已經可以使用 Java Media Framework Player API (JMF API) 
    來簡單地完成, 像 AVI, MPG, MID 等多媒體常用的格式都在支援之列.
    相關的規格文件及 Beta 版請參考: 
  
    
    http://www.javasoft.com/products/java-media/mediaplayer/



    目前首先將這份規格實作出來的竟然是硬體大廠 - Intel (意外吧 ?!) 
 
    進一步的資料請參考: 

     
     http://developer.intel.com/ial/jmedia



    同時 SGI 也宣佈了一份 IRIX 上的 JMF implementation: 

    
    http://www.sgi.com/Products/motion/




6.4 怎樣在 Java 的 application 程式裡頭播放 *.au 的音樂檔 ? 


A. 有兩個方法:



   1).  使用 AudioClip 這個 class, 但是只能播放特定的 *.au 檔案, 進一步的資訊請參考:

       
       http://www.javaworld.com/javaworld/javatips/jw-javatip24.html 



   2).  使用剛出爐的  Java Media Framework API (JMFAPI),  能夠播放的音樂檔格式會比較多一些,
         請參考 '問題 6.3'  的說明. 

         


7.1 請說明 Netscape Navigator 中取得 Applet 認證的步驟. 
 

A.          
詳細步驟可參考:
http://developer.netscape.com/one/security/index.html
 1. 取得個人的 certificate (Digital ID), 可在 Communicator/Security
    Info/Certificates/Yours 選項看到。所知道取得 Digital ID 的方法:

    a. 到公開的認證中心 (CA) 購買。

       Versign(http://digitalid.verisign.com/nosintro.htm) 分兩種 ...
       Class 2(個人), Class 3(公司) ... 前者每年 US$20-, 後者 US$400-
       。又 Class 2 僅適用美國地區。

    b. 下傳/架設/使用 Netscape 的 Certificate Server 1.01, 自己做 CA。
       http://home.netscape.com/download/ 先 Test-Drive ... 

    我是用 b.。

 2. 取得簽證工具 (Signing Tools), 有兩種:

    在 http://developer.netscape.com/software/signedobj/jarpack.html

    a. JAR Packager - 以 Java Applet 寫的 GUI 工具。還沒用它成功的簽
       證過, 最大的問題在於 ... 到目前為止, 還不能預測它什麼時候會造
       成當機。
    b. Command Line Tools for Windows 95 and NT 還有 for IRIX - 我是
       用 for 95/NT 的, 如果您想簽證 JavaScript, 還須有 perl。

       在這裡的範例中, 解開後放到 e:\sign

 3. 使用 Java Capabilities API 寫個須要被 WWW 瀏覽者做認可動作的Java
    Applet。

    參考 http://developer.netscape.com/library/documentation
               /signedobj/capsapi.html

    在這一頁要傳回一 capsapi_classes.zip, 並把它加入 CLASSPATH 中。

    底下是一簡單範例, 會提示瀏覽者它須要讀取的權力:

=== [Begin:HelloWorld.java] =======================================
import java.awt.*;
import netscape.security.PrivilegeManager;

public class HelloWorld extends java.applet.Applet {
 boolean hasPrivilege = false;
 public void init() {
  System.err.println("Trying to acquire permission to read ...");
  try {
   PrivilegeManager.enablePrivilege("UniversalPropertyRead");
   hasPrivilege = true;
   System.err.println("Success! Privilege is enabled.");
  } catch (netscape.security.ForbiddenTargetException e) {
   System.err.println("Failed! Permission to read denied by user.");
  } catch (Exception e) {
   System.err.println("Failed! Unknown exception.");
   e.printStackTrace(System.err);
  }
  System.err.println("Init end ...");
 }

 public void paint(Graphics g) {
  if (hasPrivilege)
     g.drawString("Hello World!!", 10, 30);
 }
}
=== [End:HelloWorld.java] =========================================

    只有當瀏覽者允許, 才會顯示『Hello World!!』。

 4. 按照一般的方法編譯 HelloWorld.java。

 5. 複製 sample.bat , 修改為:
=== [Begin:sign.bat] =======-======================================
zigbert -k"Duke's Test Digital ID" -d"e:\netscape\users\duke" %1
cd %1
zip -r0 ..\%1.jar *
cd ..
=== [End:sign.bat] =========-======================================

    -k 是在 Communicator/Security Info/Certificates/Yours 看到的
    -d 是放置 Communicator 使用者資料的目錄

 6. 將編好的 HelloWorld.class 放在 e:\sign\HelloWorld

 7. 執行『sign HelloWorld』,會在 e:\sign 產生一 HelloWorld.jar 檔。

 8. 寫個 HelloWorld.html, 其中特別注意
     

 

[ 首頁 ] [ 網頁小貼士 ] [ 語法練習 ] [ Java 教學 ] [ VB Script 教學 ] [ CGI教學/收集 ]