commons-net FTPClient API存取設(shè)計
文件系統(tǒng)無非就是文件的存取和組織結(jié)構(gòu)。
訪問一個文件系統(tǒng)的API也應(yīng)該是寫,讀,定位方法(Pathname?/URI?)
FTPClient針對文件的保存和獲取各提供了兩個方法,分別是:






兩個方法貌似相同,實際不同,返回流的那個因為不能馬上處理流,所以需要用戶手工調(diào)用completePendingCommand,而另一個傳遞流進(jìn)去的則不需要。可能有同學(xué)已經(jīng)遇到過這個問題了,讀寫第一個文件時總是正確的,當(dāng)相同API讀寫第二個文件時,block住了。這是因為FTPClient要求在進(jìn)行流操作之后執(zhí)行completePendingCommand,以確保流處理完畢,因為流處理不是即時的,所以也沒有辦法不手工調(diào)用completePendingCommand。問題是開發(fā)者把不返回流的方法末尾加上了completePendingCommand,如果不看代碼可能根本不知道。
文檔上說:







但是這樣仍然還是讓人有點困惑,為什么都是存儲/讀取的方法,有時候要調(diào)用completePendingCommand,有時候不調(diào)用?更嚴(yán)重的問題是completePendingCommand調(diào)用了getReply,如果一個命令通過socket stream傳了過去但是沒有g(shù)etReply,即沒有completePendingCommand,那么下次發(fā)命令時,將會受到本次返回碼的干擾,得到無效的響應(yīng)。而如果在completePendingCommand之后又進(jìn)行了一次無辜的completePendingCommand,那么因為FTP Server上沒有Reply了,就會block。所以completePendingCommand并不是可以隨意添加的。
現(xiàn)在出現(xiàn)了兩個問題:
1 completePendingCommand很容易多出來或遺漏
2 顯式調(diào)用completePendingCommand暴露了底層實現(xiàn),給用戶帶來不便,用戶只想要InputStream或者OutputStream
為了解決這個問題,可以對InputStream進(jìn)行擴(kuò)展,建立一個ReplyOnCloseInputStream,如下:





















這樣封裝之后,F(xiàn)TPClient的用戶只需要正常在處理完流之后關(guān)閉即可,而不必暴露實現(xiàn)細(xì)節(jié)。保存文件也可以用相同的方法封裝OutputStream。
@2008 楊一. 版權(quán)所有. 保留所有權(quán)利
posted on 2010-07-07 23:08 楊一 閱讀(3481) 評論(1) 編輯 收藏 所屬分類: Java SE