用Java实现FTP批量大文件上传下载(三)

时间:2021-04-25 17:21:38

五、断点续传

对于熟用QQ的程序员,QQ的断点续传功能应该是印象很深刻的。因为它很实用也很方面。因此,在我们的上传下载过程中,很实现了断点续传的功能。

其实断点续传的原理很简单,就在上传的过程中,先去服务上进行查找,是否存在此文件,如果存在些文件,则比较服务器上文件的大小与本地文件的大小,如果服务器上的文件比本地的要小,则认为此文件上传过程中应该可以进行断点续传。

在实现的过程中,RandomAccessFile类变得很有用。此类的实例支持对随机存取文件的读取和写入。随机存取文件的行为类似存储在文件系统中的一个大型字节数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机存取文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法进行设置。

RandomAccessFile类的skipBytes方法尝试跳过输入的 n 个字节以丢弃跳过的字节。如果从服务器上查得待上传文件的大小n,则采用skipBytes方法可以跳过这n个字节,从而开始从新的地方开始进行断点续传。具体的方法说明可以参见JDK5的API说明。

可以在net.sf.jftp.net. DataConnection类的run方法中,可以看出上传下载中断点续传的实现,代码如下:

用Java实现FTP批量大文件上传下载(三)public void run()
用Java实现FTP批量大文件上传下载(三)    {
用Java实现FTP批量大文件上传下载(三)        try
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)        newLine = con.getCRLF();
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)            if(Settings.getFtpPasvMode())
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                try
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    sock = new Socket(host, port);
用Java实现FTP批量大文件上传下载(三)                    sock.setSoTimeout(Settings.getSocketTimeout());
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)                catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    ok = false;
用Java实现FTP批量大文件上传下载(三)                    debug("Can't open Socket on port " + port);
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)            else
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                //Log.debug("trying new server socket: "+port);
用Java实现FTP批量大文件上传下载(三)
                try
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    ssock = new ServerSocket(port);
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)                catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    ok = false;
用Java实现FTP批量大文件上传下载(三)                    Log.debug("Can't open ServerSocket on port " + port);
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)        catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)            debug(ex.toString());
用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)        isThere = true;
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)        boolean ok = true;
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)        RandomAccessFile fOut = null;
用Java实现FTP批量大文件上传下载(三)        BufferedOutputStream bOut = null;
用Java实现FTP批量大文件上传下载(三)        RandomAccessFile fIn = null;
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)        try
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)            if(!Settings.getFtpPasvMode())
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                int retry = 0;
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                while((retry++ < 5) && (sock == null))
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    try
用Java实现FTP批量大文件上传下载(三)                    {
用Java实现FTP批量大文件上传下载(三)                        ssock.setSoTimeout(Settings.connectionTimeout);
用Java实现FTP批量大文件上传下载(三)                        sock = ssock.accept();
用Java实现FTP批量大文件上传下载(三)                    }

用Java实现FTP批量大文件上传下载(三)                    catch(IOException e)
用Java实现FTP批量大文件上传下载(三)                    {
用Java实现FTP批量大文件上传下载(三)                        sock = null;
用Java实现FTP批量大文件上传下载(三)                        debug("Got IOException while trying to open a socket!");
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                        if(retry == 5)
用Java实现FTP批量大文件上传下载(三)                        {
用Java实现FTP批量大文件上传下载(三)                            debug("Connection failed, tried 5 times - maybe try a higher timeout in Settings.java用Java实现FTP批量大文件上传下载(三)");
用Java实现FTP批量大文件上传下载(三)                        }

用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                finished = true;
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                        throw e;
用Java实现FTP批量大文件上传下载(三)                    }

用Java实现FTP批量大文件上传下载(三)                    finally
用Java实现FTP批量大文件上传下载(三)                    {
用Java实现FTP批量大文件上传下载(三)                        ssock.close();
用Java实现FTP批量大文件上传下载(三)                    }

用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                    debug("Attempt timed out, retrying用Java实现FTP批量大文件上传下载(三)");
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)            if(ok)
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                byte[] buf = new byte[Settings.bufferSize];
用Java实现FTP批量大文件上传下载(三)                start = System.currentTimeMillis();
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                int buflen = 0;
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                //---------------download,下载----------------------
用Java实现FTP批量大文件上传下载(三)
                if(type.equals(GET) || type.equals(GETDIR))
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    if(!justStream)
用Java实现FTP批量大文件上传下载(三)                    {
用Java实现FTP批量大文件上传下载(三)                        try
用Java实现FTP批量大文件上传下载(三)                        {
用Java实现FTP批量大文件上传下载(三)                            if(resume)
用Java实现FTP批量大文件上传下载(三)                            {
用Java实现FTP批量大文件上传下载(三)                                File f = new File(file);
用Java实现FTP批量大文件上传下载(三)                                fOut = new RandomAccessFile(file, "rw");
用Java实现FTP批量大文件上传下载(三)                                fOut.skipBytes((int) f.length());
用Java实现FTP批量大文件上传下载(三)                                buflen = (int) f.length();
用Java实现FTP批量大文件上传下载(三)                            }

用Java实现FTP批量大文件上传下载(三)                            else
用Java实现FTP批量大文件上传下载(三)                            {
用Java实现FTP批量大文件上传下载(三)                                if(localfile == null)
用Java实现FTP批量大文件上传下载(三)                                {
用Java实现FTP批量大文件上传下载(三)                                    localfile = file;
用Java实现FTP批量大文件上传下载(三)                                }

用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                                File f2 = new File(Settings.appHomeDir);
用Java实现FTP批量大文件上传下载(三)                                f2.mkdirs();
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                                File f = new File(localfile);
用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                                if(f.exists())
用Java实现FTP批量大文件上传下载(三)                                {
用Java实现FTP批量大文件上传下载(三)                                    f.delete();
用Java实现FTP批量大文件上传下载(三)                                }

用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                                bOut = new BufferedOutputStream(new FileOutputStream(localfile),
用Java实现FTP批量大文件上传下载(三)                                                                Settings.bufferSize);
用Java实现FTP批量大文件上传下载(三)                            }

用Java实现FTP批量大文件上传下载(三)                        }

用Java实现FTP批量大文件上传下载(三)                        catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)                        {
用Java实现FTP批量大文件上传下载(三)                            debug("Can't create outputfile: " + file);
用Java实现FTP批量大文件上传下载(三)                            ok = false;
用Java实现FTP批量大文件上传下载(三)                            ex.printStackTrace();
用Java实现FTP批量大文件上传下载(三)                        }

用Java实现FTP批量大文件上传下载(三)                    }

用Java实现FTP批量大文件上传下载(三)
用Java实现FTP批量大文件上传下载(三)                
用Java实现FTP批量大文件上传下载(三)                //---------------upload,上传----------------------
用Java实现FTP批量大文件上传下载(三)
                if(type.equals(PUT) || type.equals(PUTDIR))
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    if(in == null)
用Java实现FTP批量大文件上传下载(三)                    {
用Java实现FTP批量大文件上传下载(三)                        try
用Java实现FTP批量大文件上传下载(三)                        {
用Java实现FTP批量大文件上传下载(三)                            fIn = new RandomAccessFile(file, "r");
用Java实现FTP批量大文件上传下载(三)                            
用Java实现FTP批量大文件上传下载(三)                            if(resume)
用Java实现FTP批量大文件上传下载(三)                            {
用Java实现FTP批量大文件上传下载(三)                                fIn.skipBytes(skiplen);
用Java实现FTP批量大文件上传下载(三)                            }

用Java实现FTP批量大文件上传下载(三)                            
用Java实现FTP批量大文件上传下载(三)                            //fIn = new BufferedInputStream(new FileInputStream(file));
用Java实现FTP批量大文件上传下载(三)
                        }

用Java实现FTP批量大文件上传下载(三)                        catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)                        {
用Java实现FTP批量大文件上传下载(三)                            debug("Can't open inputfile: " + " (" + ex + ")");
用Java实现FTP批量大文件上传下载(三)                            ok = false;
用Java实现FTP批量大文件上传下载(三)                        }

用Java实现FTP批量大文件上传下载(三)                    }

用Java实现FTP批量大文件上传下载(三)                    
用Java实现FTP批量大文件上传下载(三)                    if(ok)
用Java实现FTP批量大文件上传下载(三)                    {
用Java实现FTP批量大文件上传下载(三)                        try
用Java实现FTP批量大文件上传下载(三)                        {
用Java实现FTP批量大文件上传下载(三)                            out = new BufferedOutputStream(sock.getOutputStream());
用Java实现FTP批量大文件上传下载(三)                        }

用Java实现FTP批量大文件上传下载(三)                        catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)                        {
用Java实现FTP批量大文件上传下载(三)                            ok = false;
用Java实现FTP批量大文件上传下载(三)                            debug("Can't get OutputStream");
用Java实现FTP批量大文件上传下载(三)                        }

用Java实现FTP批量大文件上传下载(三)                        
用Java实现FTP批量大文件上传下载(三)                        if(ok)
用Java实现FTP批量大文件上传下载(三)                        {
用Java实现FTP批量大文件上传下载(三)                            try
用Java实现FTP批量大文件上传下载(三)                            {
用Java实现FTP批量大文件上传下载(三)                                int len = skiplen;
用Java实现FTP批量大文件上传下载(三)                                char b;
用Java实现FTP批量大文件上传下载(三)                                
用Java实现FTP批量大文件上传下载(三)                                while(true)
用Java实现FTP批量大文件上传下载(三)                                {
用Java实现FTP批量大文件上传下载(三)                                    int read;
用Java实现FTP批量大文件上传下载(三)                                    
用Java实现FTP批量大文件上传下载(三)                                    if(in != null)
用Java实现FTP批量大文件上传下载(三)                                    {
用Java实现FTP批量大文件上传下载(三)                                        read = in.read(buf);
用Java实现FTP批量大文件上传下载(三)                                    }

用Java实现FTP批量大文件上传下载(三)                                    else
用Java实现FTP批量大文件上传下载(三)                                    {
用Java实现FTP批量大文件上传下载(三)                                        read = fIn.read(buf);
用Java实现FTP批量大文件上传下载(三)                                    }

用Java实现FTP批量大文件上传下载(三)                                    
用Java实现FTP批量大文件上传下载(三)                                    len += read;
用Java实现FTP批量大文件上传下载(三)                                    
用Java实现FTP批量大文件上传下载(三)                                    //System.out.println(file + " " + type+ " " + len + " " + read);
用Java实现FTP批量大文件上传下载(三)
                                    if(read == -1)
用Java实现FTP批量大文件上传下载(三)                                    {
用Java实现FTP批量大文件上传下载(三)                                        break;
用Java实现FTP批量大文件上传下载(三)                                    }

用Java实现FTP批量大文件上传下载(三)                                    
用Java实现FTP批量大文件上传下载(三)                                    if(newLine != null
用Java实现FTP批量大文件上传下载(三)                                    {
用Java实现FTP批量大文件上传下载(三)                                        byte[] buf2 = modifyPut(buf, read);
用Java实现FTP批量大文件上传下载(三)                                        out.write(buf2, 0, buf2.length);
用Java实现FTP批量大文件上传下载(三)                                    }

用Java实现FTP批量大文件上传下载(三)                                    else 
用Java实现FTP批量大文件上传下载(三)                                    {
用Java实现FTP批量大文件上传下载(三)                                        out.write(buf, 0, read);
用Java实现FTP批量大文件上传下载(三)                                    }

用Java实现FTP批量大文件上传下载(三)                                    
用Java实现FTP批量大文件上传下载(三)                                    con.fireProgressUpdate(file, type, len);
用Java实现FTP批量大文件上传下载(三)                                    
用Java实现FTP批量大文件上传下载(三)                                    if(time())
用Java实现FTP批量大文件上传下载(三)                                    {
用Java实现FTP批量大文件上传下载(三)                                        //   Log.debugSize(len, false, false, file);
用Java实现FTP批量大文件上传下载(三)
                                    }

用Java实现FTP批量大文件上传下载(三)                                    
用Java实现FTP批量大文件上传下载(三)                                    if(read == StreamTokenizer.TT_EOF)
用Java实现FTP批量大文件上传下载(三)                                    {
用Java实现FTP批量大文件上传下载(三)                                        break;
用Java实现FTP批量大文件上传下载(三)                                    }

用Java实现FTP批量大文件上传下载(三)                                }

用Java实现FTP批量大文件上传下载(三)                                
用Java实现FTP批量大文件上传下载(三)                                out.flush();
用Java实现FTP批量大文件上传下载(三)                                
用Java实现FTP批量大文件上传下载(三)                                //Log.debugSize(len, false, true, file);
用Java实现FTP批量大文件上传下载(三)
                            }

用Java实现FTP批量大文件上传下载(三)                            catch(IOException ex)
用Java实现FTP批量大文件上传下载(三)                            {
用Java实现FTP批量大文件上传下载(三)                                ok = false;
用Java实现FTP批量大文件上传下载(三)                                debug("Error: Data connection closed.");
用Java实现FTP批量大文件上传下载(三)                                con.fireProgressUpdate(file, FAILED, -1);
用Java实现FTP批量大文件上传下载(三)                                ex.printStackTrace();
用Java实现FTP批量大文件上传下载(三)                            }

用Java实现FTP批量大文件上传下载(三)                        }

用Java实现FTP批量大文件上传下载(三)                    }

用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)        catch(IOException ex)
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)            Log.debug("Can't connect socket to ServerSocket");
用Java实现FTP批量大文件上传下载(三)            ex.printStackTrace();
用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)        finally
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)            try
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                if(out != null)
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    out.flush();
用Java实现FTP批量大文件上传下载(三)                    out.close();
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)            catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                ex.printStackTrace();
用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)            
用Java实现FTP批量大文件上传下载(三)            try
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                if(bOut != null)
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    bOut.flush();
用Java实现FTP批量大文件上传下载(三)                    bOut.close();
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)            catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                ex.printStackTrace();
用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)            
用Java实现FTP批量大文件上传下载(三)            try
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                if(fOut != null)
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    fOut.close();
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)            catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                ex.printStackTrace();
用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)            
用Java实现FTP批量大文件上传下载(三)            try
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                if(in != null && !justStream)
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    in.close();
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)                
用Java实现FTP批量大文件上传下载(三)                if(fIn != null)
用Java实现FTP批量大文件上传下载(三)                {
用Java实现FTP批量大文件上传下载(三)                    fIn.close();
用Java实现FTP批量大文件上传下载(三)                }

用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)            catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                ex.printStackTrace();
用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)        
用Java实现FTP批量大文件上传下载(三)        try
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)            sock.close();
用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)        catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)            debug(ex.toString());
用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)        
用Java实现FTP批量大文件上传下载(三)        if(!Settings.getFtpPasvMode())
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)            try
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                ssock.close();
用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)            catch(Exception ex)
用Java实现FTP批量大文件上传下载(三)            {
用Java实现FTP批量大文件上传下载(三)                debug(ex.toString());
用Java实现FTP批量大文件上传下载(三)            }

用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)        
用Java实现FTP批量大文件上传下载(三)        finished = true;
用Java实现FTP批量大文件上传下载(三)        
用Java实现FTP批量大文件上传下载(三)        if(ok)
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)            con.fireProgressUpdate(file, FINISHED, -1);
用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)        else
用Java实现FTP批量大文件上传下载(三)        {
用Java实现FTP批量大文件上传下载(三)            con.fireProgressUpdate(file, FAILED, -1);
用Java实现FTP批量大文件上传下载(三)        }

用Java实现FTP批量大文件上传下载(三)    }

用Java实现FTP批量大文件上传下载(三)