狂奔 lion

          自強(qiáng)不息

          commons-net FTPClient API存取設(shè)計

          文件系統(tǒng)無非就是文件的存取和組織結(jié)構(gòu)。
          訪問一個文件系統(tǒng)的API也應(yīng)該是寫,讀,定位方法(Pathname?/URI?)

          FTPClient針對文件的保存和獲取各提供了兩個方法,分別是:

          public boolean storeFile(String remote, InputStream local)
          public OutputStream storeFileStream(String remote)

          public boolean retrieveFile(String remote, OutputStream local)
          public InputStream retrieveFileStream(String remote)

           

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

               * There are a few FTPClient methods that do not complete the
               
          * entire sequence of FTP commands to complete a transaction.  These
               
          * commands require some action by the programmer after the reception
               
          * of a positive intermediate command.  After the programmer's code
               * completes its actions, it must call this method to receive
               
          * the completion reply from the server and verify the success of the
               
          * entire transaction.


          但是這樣仍然還是讓人有點困惑,為什么都是存儲/讀取的方法,有時候要調(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,如下:

          private static ReplyOnCloseInputStream extends InputStream{
            
          //
            public ReplyOnCloseInputStream(InputStream is, FTPClient c){
              
          //
            }

            
          //
            @override
            
          public void close(){
              
          if(c.completePendingCommand){
                is.close();
              }
          else{
                
          //throw Exception
              }

            }

          }
           
          //
          return new ReplyOnCloseInputStream(is, client);


          這樣封裝之后,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

          評論

          # re: commons-net FTPClient API存取設(shè)計 2010-07-08 09:38 Princeton

          private static ReplyOnCloseInputStream extends InputStream{

          上面這行代碼有點搞不懂!  回復(fù)  更多評論   

          <2010年7月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          公告

          本人在blogjava上發(fā)表的文章及隨筆除特別聲明外均為原創(chuàng)或翻譯,作品受知識產(chǎn)權(quán)法保護(hù)并被授權(quán)遵從 知識分享協(xié)議:署名-非商業(yè)性使用-相同方式共享 歡迎轉(zhuǎn)載,請在轉(zhuǎn)載時注明作者姓名(楊一)及出處(www.aygfsteel.com/yangyi)
          /////////////////////////////////////////
          我的訪問者

          常用鏈接

          留言簿(5)

          隨筆分類(55)

          隨筆檔案(55)

          相冊

          Java

          其他技術(shù)

          生活

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          自強(qiáng)不息


          用心 - 珍惜時間,勇于創(chuàng)造
          主站蜘蛛池模板: 方城县| 靖江市| 饶河县| 老河口市| 格尔木市| 兖州市| 兴化市| 广东省| 白河县| 报价| 河西区| 左权县| 河间市| 湘潭市| 莱州市| 德安县| 金寨县| 灯塔市| 高平市| 乐都县| 平安县| 漳州市| 鄂尔多斯市| 永顺县| 赣州市| 澄城县| 阳新县| 浙江省| 衡阳县| 博客| 长岛县| 北川| 宁德市| 富源县| 浦江县| 方城县| 弋阳县| 明溪县| 新昌县| 松溪县| 阿城市|