轉(zhuǎn)自開發(fā)者的天空
刪除操作
通過Path類,我們可以刪除文件、目錄或符號(hào)鏈接。要注意的是當(dāng)我們刪除符號(hào)鏈接時(shí),其指向的目的目錄或文件不會(huì)被刪除。當(dāng)要?jiǎng)h除一個(gè)目錄時(shí),該目錄必須為空,否則會(huì)失敗。
Path類提供了兩個(gè)刪除方法。第一個(gè)是delete方法。Delete方法會(huì)直接刪除文件或目錄,如果刪除失敗則會(huì)拋出異常。例如如果要?jiǎng)h除的文件不存在,則會(huì)拋出NoSuchFileException。程序員可以catch這些異常并進(jìn)行相應(yīng)的處理。
另外一個(gè)方法是deleteIfExists。這個(gè)方法同樣會(huì)刪除文件或目錄,和delete方法唯一不同的是如果文件不存在,這個(gè)方法不會(huì)拋出異常。
拷貝操作
Path類提供了拷貝文件或目錄的方法,就是copyTo方法。(以前要copy文件只能夠自己寫程序完成哦!)。在進(jìn)行拷貝的時(shí)候,我們可以指定如果目標(biāo)文件或目錄已經(jīng)存在時(shí)怎么處理;如果設(shè)置了REPLACE_EXISTING,則會(huì)覆蓋已有的文件或目錄;如果沒有設(shè)置 REPLACE_EXISTING,那么拷貝操作會(huì)失敗。
要注意的是拷貝目錄時(shí),目錄中的內(nèi)容并沒有被拷貝過去,新生成的目錄會(huì)是一個(gè)空目錄。要想將目錄中的內(nèi)容一起拷貝過去,只有自己編程了。
在拷貝符號(hào)鏈接時(shí),默認(rèn)的行為是拷貝符號(hào)鏈接指向的目的文件或目錄。如果需要拷貝符號(hào)鏈接本身,需要指定NOFOLLOW_LINKS或 REPLACE_EXISTING選項(xiàng)。
CopyTo方法接受CopyOption類型的varargs。CopyOption是一個(gè)接口,目前有兩個(gè)實(shí)現(xiàn)類:StandardCopyOption和LinkOption。CopyTo方法能夠支持的選項(xiàng)有:
* REPLACE_EXISTING – 當(dāng)要拷貝的是文件是,如果目標(biāo)文件已經(jīng)存在,則覆蓋目標(biāo)文件。如果要拷貝的是目錄,當(dāng)目標(biāo)目錄已經(jīng)存在時(shí),如果目標(biāo)目錄為空,覆蓋目標(biāo)目錄;如果目標(biāo)目錄不為空,拋出FileAlreadyExistsException。如果要拷貝的是符號(hào)鏈接,那么拷貝符號(hào)鏈接本身。
* COPY_ATTRIBUTES – 連文件或目錄的屬性一起拷貝。不同的文件系統(tǒng)和平臺(tái)支持不同的文件屬性,但是所有的文件系統(tǒng)和平臺(tái)都支持最后修改時(shí)間這個(gè)屬性。
* NOFOLLOW_LINKS – 如果要拷貝的是符號(hào)鏈接,直接拷貝符號(hào)鏈接本身。
下面是使用copyTo的代碼例子:
移動(dòng)操作
Path還提供了moveTo方法來移動(dòng)文件或目錄。如果沒有設(shè)置REPLACE_EXISTING選項(xiàng),那么當(dāng)目標(biāo)文件或目錄存在時(shí),操作會(huì)失敗。
空目錄能夠被移動(dòng),但是如果目錄不為空,是否能夠移動(dòng)目錄要取決于是否能夠不移動(dòng)目錄的內(nèi)容。例如在Windows系統(tǒng)下,如果是同一個(gè)硬盤分區(qū)內(nèi)的移動(dòng),就可以成功,但是如果是不同硬盤分區(qū)之間的移動(dòng),就會(huì)失敗,會(huì)拋出FileSystemException異常。同時(shí)要注意的是,目的目錄的父目錄一定要存在,否則會(huì)拋出NoSuchFileException。例如將c:"temp"test移動(dòng)到c:"save"test,如果c:"save目錄不存在,則會(huì)拋出異常。
MoveTo方法也接受可變數(shù)量的參數(shù),其支持的選項(xiàng)有:
REPLACE_EXISTING – 覆蓋已經(jīng)存在的文件或目錄。如果目標(biāo)文件/目錄是一個(gè)符號(hào)鏈接,那么該鏈接會(huì)被覆蓋,但是起指向的文件或目錄不會(huì)受到影響。 * ATOMIC_MOVE – 移動(dòng)操作是一個(gè)原子操作。如果文件系統(tǒng)不支持移動(dòng)的原子操作,會(huì)拋出異常。原子操作能夠保證當(dāng)你移動(dòng)一個(gè)文件到一個(gè)目錄中時(shí),監(jiān)視該目錄的進(jìn)程得到的是一個(gè)完整的文件。
下面是使用moveTo方法的例子
方法 | Solaris下的輸出 | Windows下的 輸出 | 備注 |
toString | /home/joe/foo | C:\home\joe\foo | |
getName | foo | foo | 獲 取名稱序列中的最后一個(gè),也就是最底層的目錄或文件名 |
getName(0) | home | home | 獲 取名稱序列中的第一個(gè),也就是最靠近根目錄的那一層。注意根目錄不在名稱序列中 |
getNameCount | 3 | 3 | 獲 取名稱序列的元素個(gè)數(shù) |
subpath(0,2) | home/joe | home\joe | 獲 取從指定的開始點(diǎn)到指定的結(jié)束點(diǎn)的子路徑。注意這里包括開始點(diǎn),但不包括結(jié)束點(diǎn)。 |
getParent | /home/joe | \home\joe | 返 回Path指定的目錄或文件的父目錄 |
getRoot | / | C:\ | 返 回根目錄 |
isHidden | false | false | 如果文件是 隱藏文件,或者目錄是隱藏目錄,返回true。因?yàn)橐L問文件的屬性,所以如果Path指定的目錄或者文件不存在,會(huì)拋出異常。 |
在使用JDBC來查詢數(shù)據(jù)庫(kù)的時(shí)候,通常的步驟是:
1. 注冊(cè)驅(qū)動(dòng)程序
2. 獲取數(shù)據(jù)庫(kù)連接
3. 執(zhí)行查詢語(yǔ)句
4. 關(guān)閉連接。
在獲得數(shù)據(jù)庫(kù)連接后,就可以通過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{
//注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//獲取數(shù)據(jù)庫(kù)連接
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{
//關(guān)閉連接
if (rst != null)
rst.close();
if (con != null)
con.close();
}
catch (SQLException e){
throw e;
}
}
}
}
上面的程序中,在獲取主鍵信息的時(shí)候,語(yǔ)句
rst = con.getMetaData().getPrimaryKeys(null,null,"USER");
用來獲取主鍵信息。關(guān)于該函數(shù)的詳細(xì)信息,請(qǐng)參閱JDK的文檔。這里要說的是,在測(cè)試中發(fā)現(xiàn)第三個(gè)參數(shù)(數(shù)據(jù)庫(kù)表名)是大小寫敏感的,如果寫成user是查不到結(jié)果的。
MethodInterceptor: before call
Really method excuting
MethodInterceptor: after call
AfterReturningAdvice
也就是說,執(zhí)行順序是:MethodBeforeAdvice,MethodInterceptor的調(diào)用前的部分,目標(biāo)方法,MethodInterceptor的調(diào)用后的部分,AfterReturningAdvice。
如果proxy的定義是
?????
?????????
???????????
???????????
???????????
?????????
?????
執(zhí)行的結(jié)果是
MethodBeforeAdvice
MethodInterceptor: before call
Really method excuting
AfterReturningAdvice
MethodInterceptor: after call
也就是說,執(zhí)行的順序是:MethodBeforeAdvice,MethodInterceptor的調(diào)用前的部分,目標(biāo)方法,AfterReturningAdvice,MethodInterceptor的調(diào)用后的部分。
如果proxy的定義是
?????
?????????
???????????
???????????
???????????
?????????
?????
執(zhí)行的結(jié)果是:
MethodInterceptor: before call
MethodBeforeAdvice
Really method excuting
AfterReturningAdvice
MethodInterceptor: after call
也就是說,執(zhí)行的順序是:MethodInterceptor的調(diào)用前的部分,MethodBeforeAdvice,目標(biāo)方法,AfterReturningAdvice,MethodInterceptor的調(diào)用后的部分。
以上的順序是在springframework 1.2.5中測(cè)試的。
????????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();
????}
}
運(yùn)行結(jié)果是什么呢?是
Begin to test change.
This is ClassA
This field have been changed!
也就是說,在TestChangeApp類中,可以修改ClassA的私有成員變量。