我在javaeye上看到了这样一段关于ftp的代码,由于帖子长度限制,我删除了一些代码。原文地址在http://zhouzaibao.javaeye.com/blog/346000import java.io.File;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.io.InputStream;   
import java.io.OutputStream;   
import java.io.PrintWriter;   
import java.io.RandomAccessFile;  
import org.apache.commons.net.PrintCommandListener;   
import org.apache.commons.net.ftp.FTP;   
import org.apache.commons.net.ftp.FTPClient;   
import org.apache.commons.net.ftp.FTPFile;   
import org.apache.commons.net.ftp.FTPReply;   
  
/**  
 * 支持断点续传的FTP实用类  
 * @author BenZhou  
 */  
public class JContinueFTPUtil {   
    public static FTPClient ftpClient = new FTPClient();   
       
    public JContinueFTPUtil(){   
        //设置将过程中使用到的命令输出到控制台   
        this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));   
    }   
    public static enum DownloadStatus {   
    Remote_File_Noexist,    //远程文件不存在   
    Local_Bigger_Remote,    //本地文件大于远程文件   
    Download_From_Break_Success,    //断点下载文件成功   
    Download_From_Break_Failed,     //断点下载文件失败   
    Download_New_Success,           //全新下载文件成功   
    Download_New_Failed;            //全新下载文件失败   
}
    public static enum UploadStatus {   
        Create_Directory_Fail,      //远程服务器相应目录创建失败   
        Create_Directory_Success,   //远程服务器闯将目录成功   
        Upload_New_File_Success,    //上传新文件成功   
        Upload_New_File_Failed,     //上传新文件失败   
        File_Exits,                 //文件已经存在   
        Remote_Bigger_Local,        //远程文件大于本地文件   
        Upload_From_Break_Success,  //断点续传成功   
        Upload_From_Break_Failed,   //断点续传失败   
        Delete_Remote_Faild;        //删除远程文件失败   
    }  
         
        
//从FTP服务器上下载文件,支持断点续传,上传百分比汇报  
       public static DownloadStatus download(String remote,String local) throws IOException{   
        //设置被动模式   
        ftpClient.enterLocalPassiveMode();   
        //设置以二进制方式传输   
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);   
        DownloadStatus result;   
           
        //检查远程文件是否存在   
        FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"),"iso-8859-1"));   
              if(files.length != 1){   
            System.out.println("远程文件不存在");   
            return DownloadStatus.Remote_File_Noexist;   
        }   
           
        long lRemoteSize = files[0].getSize();   
        File f = new File(local);   
        //本地存在文件,进行断点下载   
        if(f.exists()){   
            long localSize = f.length();   
            //判断本地文件大小是否大于远程文件大小   
            if(localSize >= lRemoteSize){   
                System.out.println("本地文件大于远程文件,下载中止");   
                return DownloadStatus.Local_Bigger_Remote;   
            }   
               
            //进行断点续传,并记录状态   
            FileOutputStream out = new FileOutputStream(f,true);   
            ftpClient.setRestartOffset(localSize);   
            InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso-8859-1"));   
            byte[] bytes = new byte[1024];   
            long step = lRemoteSize /100;   
            long process=localSize /step;   
            int c;   
            while((c = in.read(bytes))!= -1){   
                out.write(bytes,0,c);   
                localSize+=c;   
                long nowProcess = localSize /step;   
                if(nowProcess > process){   
                    process = nowProcess;   
                    if(process % 10 == 0)   
                        System.out.println("下载进度:"+process);   
                    //TODO 更新文件下载进度,值存放在process变量中   
                }   
            }   
            in.close();   
            out.close();   
            boolean isDo = ftpClient.completePendingCommand();   
            if(isDo){   
                result = DownloadStatus.Download_From_Break_Success;   
            }else {   
                result = DownloadStatus.Download_From_Break_Failed;   
            }   
        }else {   
            OutputStream out = new FileOutputStream(f);   
            InputStream in= ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso-8859-1"));   
            byte[] bytes = new byte[1024];   
            long step = lRemoteSize /100;   
            long process=0;   
            long localSize = 0L;   
            int c;   
            while((c = in.read(bytes))!= -1){   
                out.write(bytes, 0, c);   
                localSize+=c;   
                long nowProcess = localSize /step;   
                if(nowProcess > process){   
                    process = nowProcess;   
                    if(process % 10 == 0)   
                        System.out.println("下载进度:"+process);   
                    //TODO 更新文件下载进度,值存放在process变量中   
                }   
            }   
            in.close();   
            out.close();   
            boolean upNewStatus = ftpClient.completePendingCommand();   
            if(upNewStatus){   
                result = DownloadStatus.Download_New_Success;   
            }else {   
                result = DownloadStatus.Download_New_Failed;   
            }   
        }   
        return result;   
    }   
       
        
    public static void main(String[] args) {   
        JContinueFTPUtil myFtp = new JContinueFTPUtil();   
        System.out.println("第一次");
        try 
        {   
          myFtp.connect("127.0.0.1", 21, "gou", "gou");
          System.out.println(myFtp.download("/图片/地形地质3-2.jpg", "D:\\地形地质3-2.jpg"));
          myFtp.disconnect();   
        } 
        catch (IOException e) 
        {   
            System.out.println("连接FTP出错:"+e.getMessage());   
        } 
        System.out.println("第二次");
        try {   
         myFtp.connect("127.0.0.1", 21, "gou", "gou"); 
        System.out.println(myFtp.download("/图片/夏家坪地质剖面图.jpg", "D:\\夏家坪地质剖面图.jpg"));
         myFtp.disconnect();   
       } 
        catch (IOException e) 
        {   
           System.out.println("连接FTP出错:"+e.getMessage());   
       }  
    }   
}  
请问为什么我的main函数写成代码中的那个样子,连续调用download的时候,第一次可以正确的传输文件,第二次的时候就会报  远程文件不存在 Remote_File_Noexist 这样的错误呢,我的服务器端已经有了这样的文件了,请赐教,谢谢

解决方案 »

  1.   

    怎么没有人来帮忙呢?SOS!!!!!!!!!!!!!!!!
      

  2.   

    package nc.ui.doc.doc_007; import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; import nc.itf.doc.DocDelegator; 
    import nc.vo.doc.doc_007.DirVO; 
    import nc.vo.pub.BusinessException; 
    import nc.vo.pub.SuperVO; import org.apache.commons.net.ftp.FTPClient; 
    import org.apache.commons.net.ftp.FTPFile; 
    import org.apache.commons.net.ftp.FTPReply; 
    import org.apache.commons.net.ftp.FTP; 
    public class FtpTool { 
    private FTPClient ftp; private String romateDir = ""; private String userName = ""; private String password = ""; private String host = ""; private String port = "21"; public FtpTool(String url) throws IOException { 
    //String url="ftp://user:password@ip:port/ftptest/psd"; 
    int len = url.indexOf("//"); 
    String strTemp = url.substring(len + 2); 
    len = strTemp.indexOf(":"); 
    userName = strTemp.substring(0, len); 
    strTemp = strTemp.substring(len + 1); len = strTemp.indexOf("@"); 
    password = strTemp.substring(0, len); 
    strTemp = strTemp.substring(len + 1); 
    host = ""; 
    len = strTemp.indexOf(":"); 
    if (len < 0)//没有设置端口 

    port = "21"; 
    len = strTemp.indexOf("/"); 
    if (len > -1) { 
    host = strTemp.substring(0, len); 
    strTemp = strTemp.substring(len + 1); 
    } else { 
    strTemp = ""; 

    } else { 
    host = strTemp.substring(0, len); 
    strTemp = strTemp.substring(len + 1); 
    len = strTemp.indexOf("/"); 
    if (len > -1) { 
    port = strTemp.substring(0, len); 
    strTemp = strTemp.substring(len + 1); 
    } else { 
    port = "21"; 
    strTemp = ""; 


    romateDir = strTemp; 
    ftp = new FTPClient(); 
    ftp.connect(host, FormatStringToInt(port)); } public FtpTool(String host, int port) throws IOException { 
    ftp = new FTPClient(); 
    ftp.connect(host, port); 
    } public String login(String username, String password) throws IOException { 
    this.ftp.login(username, password); 
    return this.ftp.getReplyString(); 
    } public String login() throws IOException { 
    this.ftp.login(userName, password); 
    System.out.println("ftp用户: " + userName); 
    System.out.println("ftp密码: " + password); 
    if (!romateDir.equals("")) 
    System.out.println("cd " + romateDir); 
    ftp.changeWorkingDirectory(romateDir); 
    return this.ftp.getReplyString(); 
    } public boolean upload(String pathname, String filename) throws IOException, BusinessException { int reply; 
    int j; 
    String m_sfilename = null; 
    filename = CheckNullString(filename); 
    if (filename.equals("")) 
    return false; 
    reply = ftp.getReplyCode(); 
    if (!FTPReply.isPositiveCompletion(reply)) { 
    ftp.disconnect(); 
    System.out.println("FTP server refused connection."); 
    System.exit(1); 

    FileInputStream is = null; 
    try { 
    File file_in; 
    if (pathname.endsWith(File.separator)) { 
    file_in = new File(pathname + filename); 
    } else { 
    file_in = new File(pathname + File.separator + filename); 

    if (file_in.length() == 0) { 
    System.out.println("上传文件为空!"); 
    return false; 
    }  
        //产生随机数最大到99  
        j = (int)(Math.random()*100); 
        m_sfilename = String.valueOf(j) + ".pdf"; // 生成的文件名 
    is = new FileInputStream(file_in); 
    ftp.setFileType(FTP.BINARY_FILE_TYPE); 
    ftp.storeFile(m_sfilename, is); 
    ftp.logout(); 
    } finally { 
    if (is != null) { 
    is.close(); 


    System.out.println("上传文件成功!"); 
    return true; 

    public boolean delete(String filename) throws IOException { FileInputStream is = null; 
    boolean retValue = false; 
    try { 
    retValue = ftp.deleteFile(filename); 
    ftp.logout(); 
    } finally { 
    if (is != null) { 
    is.close(); 


    return retValue; } public void close() { 
    if (ftp.isConnected()) { 
    try { 
    ftp.disconnect(); 
    } catch (IOException e) { 
    e.printStackTrace(); 


    } public static int FormatStringToInt(String p_String) { 
    int intRe = 0; 
    if (p_String != null) { 
    if (!p_String.trim().equals("")) { 
    try { 
    intRe = Integer.parseInt(p_String); 
    } catch (Exception ex) { } 


    return intRe; 
    } public static String CheckNullString(String p_String) { 
    if (p_String == null) 
    return ""; 
    else 
    return p_String; 
    } public boolean downfile(String pathname, String filename) { String outputFileName = null; 
    boolean retValue = false; 
    try { 
    FTPFile files[] = ftp.listFiles(); 
    int reply = ftp.getReplyCode(); //////////////////////////////////////////////// 
    if (!FTPReply.isPositiveCompletion(reply)) { 
    try { 
    throw new Exception("Unable to get list of files to dowload."); 
    } catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 

    } ///////////////////////////////////////////////////// 
    if (files.length == 0) { 
    System.out.println("No files are available for download."); 
    }else { 
    for (int i=0; i <files.length; i++) { 
    System.out.println("Downloading file "+files[i].getName()+"Size:"+files[i].getSize()); 
    outputFileName = pathname + filename + ".pdf"; 
    //return outputFileName; 
    File f = new File(outputFileName); ////////////////////////////////////////////////////// 
    retValue = ftp.retrieveFile(outputFileName, new FileOutputStream(f)); if (!retValue) { 
    try { 
    throw new Exception ("Downloading of remote file"+files[i].getName()+" failed. ftp.retrieveFile() returned false."); 
    } catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 

    } } 
    } ///////////////////////////////////////////////////////////// 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 

    return retValue; 
    } }