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

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

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

    posts - 310, comments - 6939, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    用Java實現FTP批量大文件上傳下載(三)

    Posted on 2007-10-22 09:45 詩特林 閱讀(7925) 評論(4)  編輯  收藏 所屬分類: Socket
                                                         用Java實現FTP批量大文件上傳下載(三) 
  • 用Java實現FTP批量大文件上傳下載(六)--代碼及示例下載
  • 用Java實現FTP批量大文件上傳下載(五) --運行效果圖
  • 用Java實現FTP批量大文件上傳下載(四)
  • 用Java實現FTP批量大文件上傳下載(三)
  • 用Java實現FTP批量大文件上傳下載(二)
  • 用Java實現FTP批量大文件上傳下載(一)

  •  

    五、斷點續傳

    對于熟用QQ的程序員,QQ的斷點續傳功能應該是印象很深刻的。因為它很實用也很方面。因此,在我們的上傳下載過程中,很實現了斷點續傳的功能。

    其實斷點續傳的原理很簡單,就在上傳的過程中,先去服務上進行查找,是否存在此文件,如果存在些文件,則比較服務器上文件的大小與本地文件的大小,如果服務器上的文件比本地的要小,則認為此文件上傳過程中應該可以進行斷點續傳。

    在實現的過程中,RandomAccessFile類變得很有用。此類的實例支持對隨機存取文件的讀取和寫入。隨機存取文件的行為類似存儲在文件系統中的一個大型字節數組。存在指向該隱含數組的光標或索引,稱為文件指針;輸入操作從文件指針開始讀取字節,并隨著對字節的讀取而前移此文件指針。如果隨機存取文件以讀取/寫入模式創建,則輸出操作也可用;輸出操作從文件指針開始寫入字節,并隨著對字節的寫入而前移此文件指針。寫入隱含數組的當前末尾之后的輸出操作導致該數組擴展。該文件指針可以通過 getFilePointer 方法讀取,并通過 seek 方法進行設置。

    RandomAccessFile類的skipBytes方法嘗試跳過輸入的 n 個字節以丟棄跳過的字節。如果從服務器上查得待上傳文件的大小n,則采用skipBytes方法可以跳過這n個字節,從而開始從新的地方開始進行斷點續傳。具體的方法說明可以參見JDK5API說明。

    可以在net.sf.jftp.net. DataConnection類的run方法中,可以看出上傳下載中斷點續傳的實現,代碼如下:

    public void run()
        
    {
            
    try
            
    {
            newLine 
    = con.getCRLF();

                
    if(Settings.getFtpPasvMode())
                
    {
                    
    try
                    
    {
                        sock 
    = new Socket(host, port);
                        sock.setSoTimeout(Settings.getSocketTimeout());
                    }

                    
    catch(Exception ex)
                    
    {
                        ok 
    = false;
                        debug(
    "Can't open Socket on port " + port);
                    }

                }

                
    else
                
    {
                    
    //Log.debug("trying new server socket: "+port);
                    try
                    
    {
                        ssock 
    = new ServerSocket(port);
                    }

                    
    catch(Exception ex)
                    
    {
                        ok 
    = false;
                        Log.debug(
    "Can't open ServerSocket on port " + port);
                    }

                }

            }

            
    catch(Exception ex)
            
    {
                debug(ex.toString());
            }


            isThere 
    = true;

            
    boolean ok = true;

            RandomAccessFile fOut 
    = null;
            BufferedOutputStream bOut 
    = null;
            RandomAccessFile fIn 
    = null;

            
    try
            
    {
                
    if(!Settings.getFtpPasvMode())
                
    {
                    
    int retry = 0;

                    
    while((retry++ < 5&& (sock == null))
                    
    {
                        
    try
                        
    {
                            ssock.setSoTimeout(Settings.connectionTimeout);
                            sock 
    = ssock.accept();
                        }

                        
    catch(IOException e)
                        
    {
                            sock 
    = null;
                            debug(
    "Got IOException while trying to open a socket!");

                            
    if(retry == 5)
                            
    {
                                debug(
    "Connection failed, tried 5 times - maybe try a higher timeout in Settings.java");
                            }


                    finished 
    = true;

                            
    throw e;
                        }

                        
    finally
                        
    {
                            ssock.close();
                        }


                        debug(
    "Attempt timed out, retrying");
                    }

                }


                
    if(ok)
                
    {
                    
    byte[] buf = new byte[Settings.bufferSize];
                    start 
    = System.currentTimeMillis();

                    
    int buflen = 0;

                    
    //---------------download,下載----------------------
                    if(type.equals(GET) || type.equals(GETDIR))
                    
    {
                        
    if(!justStream)
                        
    {
                            
    try
                            
    {
                                
    if(resume)
                                
    {
                                    File f 
    = new File(file);
                                    fOut 
    = new RandomAccessFile(file, "rw");
                                    fOut.skipBytes((
    int) f.length());
                                    buflen 
    = (int) f.length();
                                }

                                
    else
                                
    {
                                    
    if(localfile == null)
                                    
    {
                                        localfile 
    = file;
                                    }


                                    File f2 
    = new File(Settings.appHomeDir);
                                    f2.mkdirs();

                                    File f 
    = new File(localfile);

                                    
    if(f.exists())
                                    
    {
                                        f.delete();
                                    }


                                    bOut 
    = new BufferedOutputStream(new FileOutputStream(localfile),
                                                                    Settings.bufferSize);
                                }

                            }

                            
    catch(Exception ex)
                            
    {
                                debug(
    "Can't create outputfile: " + file);
                                ok 
    = false;
                                ex.printStackTrace();
                            }

                        }


                    
                    
    //---------------upload,上傳----------------------
                    if(type.equals(PUT) || type.equals(PUTDIR))
                    
    {
                        
    if(in == null)
                        
    {
                            
    try
                            
    {
                                fIn 
    = new RandomAccessFile(file, "r");
                                
                                
    if(resume)
                                
    {
                                    fIn.skipBytes(skiplen);
                                }

                                
                                
    //fIn = new BufferedInputStream(new FileInputStream(file));
                            }

                            
    catch(Exception ex)
                            
    {
                                debug(
    "Can't open inputfile: " + " (" + ex + ")");
                                ok 
    = false;
                            }

                        }

                        
                        
    if(ok)
                        
    {
                            
    try
                            
    {
                                out 
    = new BufferedOutputStream(sock.getOutputStream());
                            }

                            
    catch(Exception ex)
                            
    {
                                ok 
    = false;
                                debug(
    "Can't get OutputStream");
                            }

                            
                            
    if(ok)
                            
    {
                                
    try
                                
    {
                                    
    int len = skiplen;
                                    
    char b;
                                    
                                    
    while(true)
                                    
    {
                                        
    int read;
                                        
                                        
    if(in != null)
                                        
    {
                                            read 
    = in.read(buf);
                                        }

                                        
    else
                                        
    {
                                            read 
    = fIn.read(buf);
                                        }

                                        
                                        len 
    += read;
                                        
                                        
    //System.out.println(file + " " + type+ " " + len + " " + read);
                                        if(read == -1)
                                        
    {
                                            
    break;
                                        }

                                        
                                        
    if(newLine != null
                                        
    {
                                            
    byte[] buf2 = modifyPut(buf, read);
                                            out.write(buf2, 
    0, buf2.length);
                                        }

                                        
    else 
                                        
    {
                                            out.write(buf, 
    0, read);
                                        }

                                        
                                        con.fireProgressUpdate(file, type, len);
                                        
                                        
    if(time())
                                        
    {
                                            
    //   Log.debugSize(len, false, false, file);
                                        }

                                        
                                        
    if(read == StreamTokenizer.TT_EOF)
                                        
    {
                                            
    break;
                                        }

                                    }

                                    
                                    out.flush();
                                    
                                    
    //Log.debugSize(len, false, true, file);
                                }

                                
    catch(IOException ex)
                                
    {
                                    ok 
    = false;
                                    debug(
    "Error: Data connection closed.");
                                    con.fireProgressUpdate(file, FAILED, 
    -1);
                                    ex.printStackTrace();
                                }

                            }

                        }

                    }

                }

            }

            
    catch(IOException ex)
            
    {
                Log.debug(
    "Can't connect socket to ServerSocket");
                ex.printStackTrace();
            }

            
    finally
            
    {
                
    try
                
    {
                    
    if(out != null)
                    
    {
                        out.flush();
                        out.close();
                    }

                }

                
    catch(Exception ex)
                
    {
                    ex.printStackTrace();
                }

                
                
    try
                
    {
                    
    if(bOut != null)
                    
    {
                        bOut.flush();
                        bOut.close();
                    }

                }

                
    catch(Exception ex)
                
    {
                    ex.printStackTrace();
                }

                
                
    try
                
    {
                    
    if(fOut != null)
                    
    {
                        fOut.close();
                    }

                }

                
    catch(Exception ex)
                
    {
                    ex.printStackTrace();
                }

                
                
    try
                
    {
                    
    if(in != null && !justStream)
                    
    {
                        in.close();
                    }

                    
                    
    if(fIn != null)
                    
    {
                        fIn.close();
                    }

                }

                
    catch(Exception ex)
                
    {
                    ex.printStackTrace();
                }

            }

            
            
    try
            
    {
                sock.close();
            }

            
    catch(Exception ex)
            
    {
                debug(ex.toString());
            }

            
            
    if(!Settings.getFtpPasvMode())
            
    {
                
    try
                
    {
                    ssock.close();
                }

                
    catch(Exception ex)
                
    {
                    debug(ex.toString());
                }

            }

            
            finished 
    = true;
            
            
    if(ok)
            
    {
                con.fireProgressUpdate(file, FINISHED, 
    -1);
            }

            
    else
            
    {
                con.fireProgressUpdate(file, FAILED, 
    -1);
            }

        }


    待續
    ......

    評論

    # re: 用Java實現FTP批量大文件上傳下載(三)   回復  更多評論   

    2009-05-14 17:35 by qianc
    站長,你好!我現在正在用JFTP做一個項目,現在往FTP服務器上傳文件已經可以了,但是在斷點續傳這一塊,還是不能,我是直接引的jftp.jar文件,包里面的DataConnection中的run和你上面說的是一樣的,但是斷點續傳的功能還是沒能實現。我自定義的類中執行上傳的uploadFiles()中是用的一下代碼:BufferedInputStream bufferReader = null;
    try {
    bufferReader = new BufferedInputStream(
    new FileInputStream(current));

    DataConnection conn = new DataConnection(con, 21, "192.168.0.88", current
    .getName(), "PUT", true,19492753, bufferReader);

    conn.reset();
    conn.run();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    我的郵箱qc_future521@163.com

    # re: 用Java實現FTP批量大文件上傳下載(三)   回復  更多評論   

    2009-05-14 17:39 by qianc
    執行斷點續傳是不是就是以上的,我的寫法?拜托啦!謝謝!

    # re: 用Java實現FTP批量大文件上傳下載(三)   回復  更多評論   

    2012-08-23 14:53 by 博文
    怎么感覺好復雜嗯
    直至用apache的上傳工具不好么?
    www.bchome8.com

    # re: 用Java實現FTP批量大文件上傳下載(三) [未登錄]  回復  更多評論   

    2013-09-30 09:23 by 小白
    718589908@qq.com 拜托樓主了啊!!
    主站蜘蛛池模板: 亚洲视频在线一区二区| 久久久久久久免费视频| 日韩视频在线免费观看| 77777午夜亚洲| 免费国产作爱视频网站| 亚洲国产成人久久| 日韩免费一区二区三区在线播放| 亚洲欧洲日产国码久在线观看| 在线毛片片免费观看| 久久综合亚洲鲁鲁五月天| **毛片免费观看久久精品| 亚洲精品国产福利在线观看| 18女人毛片水真多免费| 亚洲三级在线观看| 国产精品四虎在线观看免费| 黄页网址在线免费观看| 亚洲中文字幕日产乱码高清app| 人妻在线日韩免费视频| 亚洲国产美女在线观看| 成人毛片免费播放| free哆拍拍免费永久视频| 亚洲国产精品无码久久一区二区 | 成**人免费一级毛片| 特级毛片全部免费播放a一级| 亚洲人成色77777| 99久久这里只精品国产免费| 色网站在线免费观看| 亚洲高清在线视频| 免费在线观看你懂的| 久草视频在线免费| 国产精品亚洲а∨天堂2021 | 一个人看的免费高清视频日本| 亚洲综合久久成人69| 全黄性性激高免费视频| 久久国产精品免费观看| 久久亚洲精品无码网站| 亚洲尹人香蕉网在线视颅| 狠狠色婷婷狠狠狠亚洲综合| 免费a级毛片高清视频不卡| 成人A毛片免费观看网站| 亚洲AV无码一区二区三区鸳鸯影院 |