<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    狂奔 lion

    自強不息

    commons-net FTPClient API存取設計

    文件系統無非就是文件的存取和組織結構。
    訪問一個文件系統的API也應該是寫,讀,定位方法(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)

     

    兩個方法貌似相同,實際不同,返回流的那個因為不能馬上處理流,所以需要用戶手工調用completePendingCommand,而另一個傳遞流進去的則不需要。可能有同學已經遇到過這個問題了,讀寫第一個文件時總是正確的,當相同API讀寫第二個文件時,block住了。這是因為FTPClient要求在進行流操作之后執行completePendingCommand,以確保流處理完畢,因為流處理不是即時的,所以也沒有辦法不手工調用completePendingCommand。問題是開發者把不返回流的方法末尾加上了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.


    但是這樣仍然還是讓人有點困惑,為什么都是存儲/讀取的方法,有時候要調用completePendingCommand,有時候不調用?更嚴重的問題是completePendingCommand調用了getReply,如果一個命令通過socket stream傳了過去但是沒有getReply,即沒有completePendingCommand,那么下次發命令時,將會受到本次返回碼的干擾,得到無效的響應。而如果在completePendingCommand之后又進行了一次無辜的completePendingCommand,那么因為FTP Server上沒有Reply了,就會block。所以completePendingCommand并不是可以隨意添加的。

    現在出現了兩個問題:
    1 completePendingCommand很容易多出來或遺漏
    2 顯式調用completePendingCommand暴露了底層實現,給用戶帶來不便,用戶只想要InputStream或者OutputStream

    為了解決這個問題,可以對InputStream進行擴展,建立一個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);


    這樣封裝之后,FTPClient的用戶只需要正常在處理完流之后關閉即可,而不必暴露實現細節。保存文件也可以用相同的方法封裝OutputStream。



     @2008 楊一. 版權所有. 保留所有權利

    posted on 2010-07-07 23:08 楊一 閱讀(3465) 評論(1)  編輯  收藏 所屬分類: Java SE

    評論

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

    private static ReplyOnCloseInputStream extends InputStream{

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

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

    導航

    公告

    本人在blogjava上發表的文章及隨筆除特別聲明外均為原創或翻譯,作品受知識產權法保護并被授權遵從 知識分享協議:署名-非商業性使用-相同方式共享 歡迎轉載,請在轉載時注明作者姓名(楊一)及出處(m.tkk7.com/yangyi)
    /////////////////////////////////////////
    我的訪問者

    常用鏈接

    留言簿(5)

    隨筆分類(55)

    隨筆檔案(55)

    相冊

    Java

    其他技術

    生活

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    自強不息


    用心 - 珍惜時間,勇于創造
    主站蜘蛛池模板: 亚洲中文字幕在线观看| 亚洲最大av无码网址| 亚洲国产精品无码久久久| 免费观看一区二区三区| 中文字幕亚洲图片| 中文字幕无码免费久久9一区9| 国产aⅴ无码专区亚洲av麻豆| 成人免费ā片在线观看| 亚洲无线码在线一区观看| 免费观看一区二区三区| 内射干少妇亚洲69XXX| 曰曰鲁夜夜免费播放视频| 亚洲国产区男人本色| 一区国严二区亚洲三区| caoporm超免费公开视频| 亚洲AV无码一区二区三区DV| 亚洲毛片在线免费观看| 亚洲日韩国产精品乱-久| 国产精品99久久免费| 国产精品hd免费观看| 亚洲视频在线视频| 免费人成在线视频| 在线播放国产不卡免费视频 | 国产老女人精品免费视频| 免费视频成人国产精品网站| 亚洲成在人线av| 无人在线观看免费高清视频| 污视频网站免费观看| 久久精品国产精品亚洲艾| 欧美a级在线现免费观看| 免费国产a理论片| 久久久久亚洲精品无码蜜桃| 日本人护士免费xxxx视频| 中文字幕a∨在线乱码免费看| 亚洲国产精品久久人人爱| 国产成人无码区免费A∨视频网站| 大妹子影视剧在线观看全集免费 | 免费一级特黄特色大片在线观看| 中国国产高清免费av片| 亚洲伊人久久大香线蕉啊| 亚洲国产精品成人|