同步輸出目錄
在Java開發過程中,有時候我們要創建一些簡單的類來測試某些功能,測試完成後就從磁盤刪除該類的源文件,因為我們不想讓該類出現在最終的產品中。但是,雖然源文件已經被刪除,編譯好的class文件仍可能留在磁盤上,當有其他的類依賴於該類,就可能導致開發環境的不穩定。
在JBuilder中,我們可以設置一個編譯選項來同步(Synchronize)Java的源文件和對應的類,這樣,一旦Java源文件被刪除,對應的class文件也將被刪除。按照如下步驟設置該同步選項:
打開 Project | Project Properties...
選擇 Compiler 選項卡,看到如下對話框:
注意Synchronize output dir選項。選中該選項就可以實現輸出目錄同步,每次編譯時JBuilder將保證Java源文件與Java class文件的同步。
輸出調試信息
很多時候,我們要向標准輸出設備輸出一些簡單的變量值,以便了解程序的運行情況。例如,在程序中加入類似下面的代碼:
System.out.println("調試信息: 變量的值是" + value);
當編寫和調試代碼的工作結束,接下去就要進行最後的編譯和打包,這時就要刪除所有上面這些System.out.println代碼。為了避免這些麻煩,我們可以引入一個邏輯變量debugMode,把它設置為true,並在輸出調試信息之前檢查這個變量的值:
if (debugMode)
System.out.println("調試信息: 變量的值是" + value);
所有調試工作結束之後,再把debugMode變量設置成false,這樣程序運行時就不會再輸出調試信息。
但是,這還不是處理類似調試信息的最佳辦法,我們可以用Diagnostic類來改進。Diagnostic類有三個與輸出流有關的方法,除了標准的System.err輸出流,還可以賦予其他不同的輸出流(例如文件或URL)。最重要的是,當編寫和調試代碼的工作結束之後,我們可以在正式編譯時排除Diagnostic類,從而也就排除了對Diagnostic類方法的所有調用。
下面是Diagnostic類中可用於輸出信息的三個方法:
print(String message):輸出信息
println(String message):輸出信息,並追加行結束符。
printlnc(String message):輸出帶有行結束符、計數器(它的值不斷遞進)和Tab字符的信息。
因此,我們可以把上面的System.out.println替換為:
Diagnostic.printlnc("調試信息:變量的值是:" + value);
這些輸出方法的標准輸出設備是System.err,但我們可以用setLogStream(PrintStream log)方法改變它。例如,假設要把輸出發送到log.txt文件,只需插入如下代碼:
Diagnostic.setLogStream(new java.io.PrintStream(new
java.io.FileOutputStream("log.txt")));
最後,在開發期間,我們只需調用一個方法就可以關閉所有的輸出:
Diagnostic.enable(false);
資源捆綁
在Java中,要把直接嵌入到程序的字符串作為資源使用是很容易的。例如,只要把字符串保存到一個獨立的文件,我們就可以很方便地通過創建不同的文件實現對多種語言的支持。
為了把“硬編碼”的字符串保存到資源捆綁文件,標准Java API提供兩種辦法:
· 把鍵-值對以屬性文件的形式保存到文本文件。
· 把鍵-值對保存到Java源文件中的String[][]數組對象,該Java源文件從java.util.ListResourceBundle擴展。
第一種方法具有較好的靈活性,可以在不重新編譯的前提下修改字符串值。第二種方法具有較好的性能,但每次修改字符串值,包含鍵-值對的Java源代碼文件都必須重新編譯。JBuilder提供了保存硬編碼字符串值的第三種方法,即com.borland.jb.util.ArrayResourceBundle。
ArrayResourceBundle類通過一個String[]數組對象保存鍵的值,但不包含鍵,我們可以通過索引訪問值,即第一個值的索引為0,第二個值的索引為1,等等。由於可以直接訪問值,因此性能相當好。但也有缺點——維護保存值的文件很困難,因為值和鍵之間沒有直接的(直觀的)聯系。
異常跟蹤
在Java中,利用try..catch(..finally)語句可以捕獲和處理異常,非常方便。catch塊的常見異常處理方式是輸出異常,例如把異常輸出到日志文件。
Exception類有一個printStackTrace()方法,它能夠從發生異常的方法中輸出堆棧信息,默認輸出位置是System.err。但是,有時候我們要把堆棧信息輸出到System.err之外的其他地方,例如在出現異常時把堆棧信息輸出到email,或者用一個對話框顯示出來。
printStackTrace()方法有幾種不同的類型:
· printStackTrace(),輸出到標准錯誤流。
· printStackTrace(PrintStream ps),輸出到名為ps的PrintStream。
· printStackTrace(PrintWriter pw),輸出到名為pw的PrintWriter。
我們可以用最後一種printStackTrace()方法把堆棧信息保存到String對象。只要在String對象中捕獲了堆棧信息,我們就可以方便地在應用的任何地方使用這些信息了。下面的代碼片斷示范了具體的實現步驟:
private String getStackTraceAsString() {
// StringWriter將包含堆棧信息
StringWriter stringWriter = new StringWriter();
//必須將StringWriter封裝成PrintWriter對象,
//以滿足printStackTrace的要求
PrintWriter printWriter = new PrintWriter(stringWriter);
//獲取堆棧信息
e.printStackTrace(printWriter);
//轉換成String,並返回該String
StringBuffer error = stringWriter.getBuffer();
return error.toString();
}
快速查看JavaBean基本信息
在JBuilder中,要查看JavaBean的內部信息是非常方便的。我們可以把JavaBean拖入設計窗口中,通過Object Inspector查看JavaBean的屬性和事件。但是,即使不通過設計器,我們也可以查看JavaBean的信息,這就是使用BeanInsight(菜單:Tools | BeanInsight)。
點擊Examine Bean按鈕就開始分析指定的JavaBean,在BeanInsight Result區域可以看到分析JavaBean的結果。如果要了解更詳細的信息,點擊“View Details...”按鈕。
多個行的屬性值
屬性文件是保存應用配置信息的好方法。有了屬性文件,修改應用參數時只需修改簡單的屬性文本文件,無需重新編譯整個應用。
屬性文件以“鍵-值”對的形式保存數據。每一個行以鍵開頭,加上一個等於符號,再加上與該鍵對應的值。鍵與值必須在同一個行上,這一點很重要。但是,有些時候,值的內容非常多,如果值能夠分成多行存放,將帶來很大的方便。下面我們就來看看如何使用多行的屬性值。
首先,下面這個代碼片斷讀取test.properties屬性文件:
try {
Properties p = new Properties();
File file = new File("test.properties");
FileInputStream fis = new FileInputStream(file);
p.load(fis);
} catch (IOException ioex) {
ioex.printStackTrace();
}
Properties類的load()方法需要一個輸入流作為參數,這裡我們向它傳入了一個FileInputStream對象。
接下來,我們就可以通過調用getProperty()方法從Properties對象獲取屬性值。下面我們來看看test.properties屬性文件的內容:
singleline=Single line value
multiline =This example shows how we
can write a property
value over multiple lines in a
properties file
這個屬性文件保存了兩個屬性,鍵分別是singleline和multiline。singleline的值只有一行,而multiline的值有多行。
如果我們調用Properties對象的getProperty()方法,並輸出屬性值,結果將是:
調用:
System.out.println("singleline? " + p.getProperty("singleline"));
System.out.println("multiline ? " + p.getProperty("multiline"));
結果:
singleline? Single line value
multiline ? This example shows how we
multiline屬性只包含了第一行值。那麼,如何解決這個問題呢?其實很簡單,只需要在每個行的末尾加上轉義字符“\”就可以了。修改後的屬性文件如下所示:
singleline=Single line value
multiline =This example shows how we \
can write a property \
value over multiple lines in a \
properties file
再次讀取屬性文件的值,multiline的屬性值就能夠完整地讀取出來