轉自開發者的天空
刪除操作
通過Path類,我們可以刪除文件、目錄或符號鏈接。要注意的是當我們刪除符號鏈接時,其指向的目的目錄或文件不會被刪除。當要刪除一個目錄時,該目錄必須為空,否則會失敗。
Path類提供了兩個刪除方法。第一個是delete方法。Delete方法會直接刪除文件或目錄,如果刪除失敗則會拋出異常。例如如果要刪除的文件不存在,則會拋出NoSuchFileException。程序員可以catch這些異常并進行相應的處理。
另外一個方法是deleteIfExists。這個方法同樣會刪除文件或目錄,和delete方法唯一不同的是如果文件不存在,這個方法不會拋出異常。
拷貝操作
Path類提供了拷貝文件或目錄的方法,就是copyTo方法。(以前要copy文件只能夠自己寫程序完成哦!)。在進行拷貝的時候,我們可以指定如果目標文件或目錄已經存在時怎么處理;如果設置了REPLACE_EXISTING,則會覆蓋已有的文件或目錄;如果沒有設置 REPLACE_EXISTING,那么拷貝操作會失敗。
要注意的是拷貝目錄時,目錄中的內容并沒有被拷貝過去,新生成的目錄會是一個空目錄。要想將目錄中的內容一起拷貝過去,只有自己編程了。
在拷貝符號鏈接時,默認的行為是拷貝符號鏈接指向的目的文件或目錄。如果需要拷貝符號鏈接本身,需要指定NOFOLLOW_LINKS或 REPLACE_EXISTING選項。
CopyTo方法接受CopyOption類型的varargs。CopyOption是一個接口,目前有兩個實現類:StandardCopyOption和LinkOption。CopyTo方法能夠支持的選項有:
* REPLACE_EXISTING – 當要拷貝的是文件是,如果目標文件已經存在,則覆蓋目標文件。如果要拷貝的是目錄,當目標目錄已經存在時,如果目標目錄為空,覆蓋目標目錄;如果目標目錄不為空,拋出FileAlreadyExistsException。如果要拷貝的是符號鏈接,那么拷貝符號鏈接本身。
* COPY_ATTRIBUTES – 連文件或目錄的屬性一起拷貝。不同的文件系統和平臺支持不同的文件屬性,但是所有的文件系統和平臺都支持最后修改時間這個屬性。
* NOFOLLOW_LINKS – 如果要拷貝的是符號鏈接,直接拷貝符號鏈接本身。
下面是使用copyTo的代碼例子:
移動操作
Path還提供了moveTo方法來移動文件或目錄。如果沒有設置REPLACE_EXISTING選項,那么當目標文件或目錄存在時,操作會失敗。
空目錄能夠被移動,但是如果目錄不為空,是否能夠移動目錄要取決于是否能夠不移動目錄的內容。例如在Windows系統下,如果是同一個硬盤分區內的移動,就可以成功,但是如果是不同硬盤分區之間的移動,就會失敗,會拋出FileSystemException異常。同時要注意的是,目的目錄的父目錄一定要存在,否則會拋出NoSuchFileException。例如將c:"temp"test移動到c:"save"test,如果c:"save目錄不存在,則會拋出異常。
MoveTo方法也接受可變數量的參數,其支持的選項有:
REPLACE_EXISTING – 覆蓋已經存在的文件或目錄。如果目標文件/目錄是一個符號鏈接,那么該鏈接會被覆蓋,但是起指向的文件或目錄不會受到影響。 * ATOMIC_MOVE – 移動操作是一個原子操作。如果文件系統不支持移動的原子操作,會拋出異常。原子操作能夠保證當你移動一個文件到一個目錄中時,監視該目錄的進程得到的是一個完整的文件。
下面是使用moveTo方法的例子
方法 | Solaris下的輸出 | Windows下的 輸出 | 備注 |
toString | /home/joe/foo | C:\home\joe\foo | |
getName | foo | foo | 獲 取名稱序列中的最后一個,也就是最底層的目錄或文件名 |
getName(0) | home | home | 獲 取名稱序列中的第一個,也就是最靠近根目錄的那一層。注意根目錄不在名稱序列中 |
getNameCount | 3 | 3 | 獲 取名稱序列的元素個數 |
subpath(0,2) | home/joe | home\joe | 獲 取從指定的開始點到指定的結束點的子路徑。注意這里包括開始點,但不包括結束點。 |
getParent | /home/joe | \home\joe | 返 回Path指定的目錄或文件的父目錄 |
getRoot | / | C:\ | 返 回根目錄 |
isHidden | false | false | 如果文件是 隱藏文件,或者目錄是隱藏目錄,返回true。因為要訪問文件的屬性,所以如果Path指定的目錄或者文件不存在,會拋出異常。 |
在使用JDBC來查詢數據庫的時候,通常的步驟是:
1. 注冊驅動程序
2. 獲取數據庫連接
3. 執行查詢語句
4. 關閉連接。
在獲得數據庫連接后,就可以通過getMetaData()方法來獲取DatabaseMetaData;然后通過DatabaseMetaData的getPrimaryKeys ()方法來獲取主鍵的信息。
下面是我做的示例程序,該程序在JBuilder2005+oracle8i下通過:
import java.sql.*;
import javax.sql.*;
public class TestJDBC {
public TestJDBC() {
}
public static void main(String[] args) throws SQLException {
Connection con = null;
Statement st = null;
ResultSet rst = null;
try{
//注冊數據庫驅動程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//獲取數據庫連接
con = DriverManager.getConnection("jdbc:oracle:thin:@10.60.203.80:1521:TestDB","123","123");
//獲取主鍵信息
rst = con.getMetaData().getPrimaryKeys(null,null,"USER");
//打印主鍵信息
if (!rst.isAfterLast()) {
rst.next();
System.out.println(rst.getString("TABLE_NAME") + " " +
rst.getString("COLUMN_NAME"));
}
}
catch (Exception e){
System.out.println(e.getLocalizedMessage());
}
finally{
try{
//關閉連接
if (rst != null)
rst.close();
if (con != null)
con.close();
}
catch (SQLException e){
throw e;
}
}
}
}
上面的程序中,在獲取主鍵信息的時候,語句
rst = con.getMetaData().getPrimaryKeys(null,null,"USER");
用來獲取主鍵信息。關于該函數的詳細信息,請參閱JDK的文檔。這里要說的是,在測試中發現第三個參數(數據庫表名)是大小寫敏感的,如果寫成user是查不到結果的。
MethodInterceptor: before call
Really method excuting
MethodInterceptor: after call
AfterReturningAdvice
也就是說,執行順序是:MethodBeforeAdvice,MethodInterceptor的調用前的部分,目標方法,MethodInterceptor的調用后的部分,AfterReturningAdvice。
如果proxy的定義是
?????
?????????
???????????
???????????
???????????
?????????
?????
執行的結果是
MethodBeforeAdvice
MethodInterceptor: before call
Really method excuting
AfterReturningAdvice
MethodInterceptor: after call
也就是說,執行的順序是:MethodBeforeAdvice,MethodInterceptor的調用前的部分,目標方法,AfterReturningAdvice,MethodInterceptor的調用后的部分。
如果proxy的定義是
?????
?????????
???????????
???????????
???????????
?????????
?????
執行的結果是:
MethodInterceptor: before call
MethodBeforeAdvice
Really method excuting
AfterReturningAdvice
MethodInterceptor: after call
也就是說,執行的順序是:MethodInterceptor的調用前的部分,MethodBeforeAdvice,目標方法,AfterReturningAdvice,MethodInterceptor的調用后的部分。
以上的順序是在springframework 1.2.5中測試的。
????????Field[] fields = test.getClass().getDeclaredFields();
??
????????try
????????{
????????????for (int i=0;i
??????????????? if (fields[i].getType().equals(java.lang.String.class)){
???????????????????fields[i].setAccessible(true);
???????????????????fields[i].set(test, "This field have been changed!");
???????????????}
????????????}
???
????????}
????????catch (Exception e)
????????{
????????}
????????test.myPrint();
????}
}
運行結果是什么呢?是
Begin to test change.
This is ClassA
This field have been changed!
也就是說,在TestChangeApp類中,可以修改ClassA的私有成員變量。