Java实现的FTP类

Java实现的FTP类


import org.apache.commons.net.ftp.*;



import java.io.File;

import java.io.IOException;

import java.io.FileOutputStream;

import java.io.FileInputStream;

import java.net.SocketException;


public class FtpOperator {

    FtpConfig ftpConfig;



    public FtpOperator(FtpConfig ftpConfig) {

        this.ftpConfig = ftpConfig;

    }



    public FtpOperator(String serverHost, String port, String user, String password) {

        this(new FtpConfig(serverHost, port, user, password, null, null));

    }



    public FtpOperator(String serverHost, String port){

        this(new FtpConfig(serverHost, port, "anonymous", "", null, null));

    }



    public FtpConfig getFtpConfig() {

        return ftpConfig;

    }



    public void setFtpConfig(FtpConfig ftpConfig) {

        this.ftpConfig = ftpConfig;

    }



    public FTPClient startClient()throws FtpException{

        FTPClient ftpClient = new FTPClient();

        String serverHost = ftpConfig.getServerHost();

        String serverPort = ftpConfig.getServerPort();

        int port = 0;

        try {

            port = Integer.parseInt(serverPort);

        } catch (Exception e) {

            throw new FtpException("Wrong FTP port:"+ftpConfig.getServerPort());

        }

        try {

            ftpClient.connect(serverHost,port);

            String username = ftpConfig.getUser(),

                   password = ftpConfig.getPassword();

            if(!ftpClient.login(username, password))

                throw new FtpException("Wrong FTP login/passwd:"+username+"/"+password);



        }catch(SocketException se){

            throw new FtpException("Socket timeout cannot set.");

        }catch(IOException ioe) {

            throw new FtpException("Cannot open ftp connection: "+serverHost+":"+serverPort);

        }

        return ftpClient;

    }



    public void disposeClient(FTPClient ftpClient){

        if(ftpClient==null)

            return;

        if(ftpClient.isConnected()){

            try {

                ftpClient.disconnect();

            } catch (IOException e) {

            }

        }

    }





    public void retrieveRemoteFile(FTPClient ftpClient, String remoteRelativePathName, File localFile)throws FtpException{

        try {

            remoteRelativePathName = remoteRelativePathName.trim();

            String filename = null;

            String workingDir = null;

            String serverBaseDir = ftpConfig.getRemoteBaseDir();

            if(serverBaseDir==null)

                serverBaseDir = ".";



            int lastSlash = remoteRelativePathName.lastIndexOf("/");

            if(lastSlash==remoteRelativePathName.length()-1)

                throw new FtpException("Cannot fetch a file with empty name.");

            if(lastSlash>0){

                filename = remoteRelativePathName.substring(lastSlash+1);

                workingDir = serverBaseDir+"/"+remoteRelativePathName.substring(0,lastSlash);

            }else{

                filename = remoteRelativePathName;

                workingDir = serverBaseDir;

            }





            if(!ftpClient.changeWorkingDirectory(workingDir)){

                throw new FtpException("Cannot change to dir:"+workingDir);

            }



            File localDirFile = localFile.getParentFile();

            localDirFile.mkdirs();



            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            FileOutputStream localOutputStream = null;

            try {

                localOutputStream = new FileOutputStream(localFile);

                if(!ftpClient.retrieveFile(filename, localOutputStream))

                    throw new FtpException("Cannot get file:"+filename+" in dir:"+workingDir);

            } catch (IOException e) {

                throw new FtpException("File IO error.");

            }finally{

                if(localOutputStream!=null){

                    try {

                        localOutputStream.close();

                    } catch (IOException e) {

                    }

                }

            }

        } catch (IOException e) {

            throw new FtpException("FTP operation error.");

        }

    }



    public void retrieveRemoteFile(String remoteRelativePathName, File localFile)throws FtpException{

        FTPClient ftpClient = startClient();

        try {

           retrieveRemoteFile(ftpClient, remoteRelativePathName, localFile);

        } finally {

            disposeClient(ftpClient);

        }

    }





    public File retrieveRemoteFile(FTPClient ftpClient , String remoteRelativePathName, String localRelativePathName)throws FtpException{

        File retrievedFile = null;

        try {

            remoteRelativePathName = remoteRelativePathName.trim();

            String filename = null;

            String workingDir = null;

            String serverBaseDir = ftpConfig.getRemoteBaseDir();

            if(serverBaseDir==null)

                serverBaseDir = ".";

            String localBaseDir = ftpConfig.getLocalBaseDir();

            if(localBaseDir==null)

                localBaseDir = ".";



            int lastSlash = remoteRelativePathName.lastIndexOf("/");

            if(lastSlash==remoteRelativePathName.length()-1)

                throw new FtpException("Cannot fetch a file with empty name.");

            if(lastSlash>0){

                filename = remoteRelativePathName.substring(lastSlash+1);

                workingDir = serverBaseDir+"/"+remoteRelativePathName.substring(0,lastSlash);

            }else{

                filename = remoteRelativePathName;

                workingDir = serverBaseDir;

            }



            retrievedFile = new File(localBaseDir + "/" + localRelativePathName);



            if(!ftpClient.changeWorkingDirectory(workingDir)){

                throw new FtpException("Cannot change to dir:"+workingDir);

            }



            File localDirFile = retrievedFile.getParentFile();

            localDirFile.mkdirs();



            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            FileOutputStream localOutputStream = null;

            try {

                localOutputStream = new FileOutputStream(retrievedFile);

                if(!ftpClient.retrieveFile(filename, localOutputStream))

                    throw new FtpException("Cannot get file:"+filename+" in dir:"+workingDir);

            } catch (IOException e) {

                throw new FtpException("File IO error.");

            }finally{

                if(localOutputStream!=null){

                    try {

                        localOutputStream.close();

                    } catch (IOException e) {

                    }

                }

            }

        } catch (IOException e) {

            throw new FtpException("FTP operation error.");

        }

        return retrievedFile;

    }







    public File retrieveRemoteFile(String remoteRelativePathName, String localRelativePathName)throws FtpException{

        FTPClient ftpClient = startClient();

        File retrievedFile = null;

        try {

            retrievedFile = retrieveRemoteFile(ftpClient, remoteRelativePathName, localRelativePathName);

        } finally {

            disposeClient(ftpClient);

        }

        return retrievedFile;

    }





    public File retrieveRemoteFile(FTPClient ftpClient, String relativePathName)throws FtpException{

        File retrievedFile = null;



        try {

            relativePathName = relativePathName.trim();

            String filename = null;

            String workingDir = null;

            String localDir = null;

            String serverBaseDir = ftpConfig.getRemoteBaseDir();

            if(serverBaseDir==null)

                serverBaseDir = ".";

            String localBaseDir = ftpConfig.getLocalBaseDir();

            if(localBaseDir==null)

                localBaseDir = ".";



            int lastSlash = relativePathName.lastIndexOf("/");

            if(lastSlash==relativePathName.length()-1)

                throw new FtpException("Cannot fetch a file with empty name.");

            if(lastSlash>0){

                filename = relativePathName.substring(lastSlash+1);

                workingDir = serverBaseDir+"/"+relativePathName.substring(0,lastSlash);

                localDir = localBaseDir+"/"+ relativePathName.substring(0,lastSlash);

            }else{

                filename = relativePathName;

                workingDir = serverBaseDir;

                localDir = localBaseDir;

            }



            if(!ftpClient.changeWorkingDirectory(workingDir)){

                throw new FtpException("Cannot change to dir:"+workingDir);

            }



            File localDirFile = new File(localDir);

            localDirFile.mkdirs();

            retrievedFile = new File(localDirFile,filename);

            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            FileOutputStream localOutputStream = null;

            try {

                localOutputStream = new FileOutputStream(retrievedFile);

                if(!ftpClient.retrieveFile(filename, localOutputStream))

                    throw new FtpException("Cannot get file:"+filename+" in dir:"+workingDir);

            } catch (IOException e) {

                throw new FtpException("File IO error.");

            }finally{

                if(localOutputStream!=null){

                    try {

                        localOutputStream.close();

                    } catch (IOException e) {

                    }

                }

            }

        } catch (IOException e) {

            throw new FtpException("FTP operation error.");

        }



        return retrievedFile;

    }



    public File retrieveRemoteFile(String relativePathName)throws FtpException{

        FTPClient ftpClient = startClient();

        File retrievedFile = null;

        try {

            retrievedFile = retrieveRemoteFile(ftpClient, relativePathName);

        } finally {

            disposeClient(ftpClient);

        }



        return retrievedFile;

    }



    public void putRemoteFile(FTPClient ftpClient, File localFile, String remoteDir, String newName)throws FtpException{

        if(!localFile.isFile())

            throw new FtpException("Upload target doesn't exist or is not a file.");



        String serverBaseDir = ftpConfig.getRemoteBaseDir();

        if(serverBaseDir==null)

           serverBaseDir = ".";

        if(newName == null)

            newName = localFile.getName();



        try {

            String putDir = null;

            if(remoteDir==null){

                putDir = serverBaseDir;

            }else{

                putDir = serverBaseDir+"/"+remoteDir;

            }

            ftpClient.makeDirectory(putDir);

            if(!ftpClient.changeWorkingDirectory(putDir)){

                throw new FtpException("Cannot change to dir:"+putDir);

            }



            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            FileInputStream inputStream = null;

            try {

                inputStream = new FileInputStream(localFile);

                if (!ftpClient.storeFile(newName, inputStream)) {

                    throw new FtpException("Upload file error.");

                }

            } catch (IOException e) {

                throw new FtpException("Local file read error.");

            } finally {

                if(inputStream!=null){

                    try {

                        inputStream.close();

                    } catch (IOException e) {

                    }

                }

            }

        } catch (IOException e) {

            throw new FtpException("FTP operation error.");

        }

    }



    public void putRemoteFile(File localFile, String remoteDir, String newName)throws FtpException{

        if(!localFile.isFile())

            throw new FtpException("Upload target doesn't exist or is not a file.");



        FTPClient ftpClient = startClient();

        try {

            putRemoteFile(ftpClient, localFile, remoteDir, newName);

        } finally {

            disposeClient(ftpClient);

        }

    }



    public void renameRemoteFile(FTPClient ftpClient, String remoteDir, String oldFileName, String newFileName)

        throws FtpException{

        String serverBaseDir = ftpConfig.getRemoteBaseDir();

        if(serverBaseDir==null)

           serverBaseDir = ".";

        String workingDir = null;

        if(remoteDir==null){

            workingDir = serverBaseDir;

        }else{

            workingDir = serverBaseDir + "/" + remoteDir;

        }

        try {

            if(!ftpClient.changeWorkingDirectory(workingDir)){

                throw new FtpException("Cannot change to dir:"+workingDir);

            }

            if(!ftpClient.rename(oldFileName, newFileName)){

                throw new FtpException("Cannot rename'"+oldFileName+"' to '"+newFileName+"'");

            }

        } catch (IOException e) {

            throw new FtpException("FTP operation error");

        }

    }



    public void renameRemoteFile(String remoteDir, String oldFileName, String newFileName)

        throws FtpException{

        FTPClient ftpClient = startClient();



        try {

            renameRemoteFile(ftpClient, remoteDir, oldFileName, newFileName);

        }finally{

            disposeClient(ftpClient);

        }

    }





    public void deleteRemoteFile(FTPClient ftpClient, String relativePathName)throws FtpException{

        if(relativePathName==null)

            throw new FtpException("File to delete is null");



        String serverBaseDir = ftpConfig.getRemoteBaseDir();

        if(serverBaseDir==null)

           serverBaseDir = ".";

        try {

            if (!ftpClient.deleteFile(serverBaseDir+ "/" +relativePathName)) {

                throw new FtpException("Delete file error, or file does not exist.");

            }

        } catch (IOException e) {

            throw new FtpException("FTP operation error");

        }

    }



    public void deleteRemoteFile(String relativePathName)throws FtpException{

        if(relativePathName==null)

            throw new FtpException("File to delete is null");



        FTPClient ftpClient = startClient();

        try {

            deleteRemoteFile(ftpClient, relativePathName);

        } finally{

            disposeClient(ftpClient);

        }

    }



    /**

     * Check file existence by using ftp command "RNFR" (rename from)

     * Since no RNTO follows it, there will be no side effect.

     * @param relativePathName

     * @return if remote file/dir exist, return true, otherwise, return false.

     * @throws FtpException

     */

    public boolean checkRemoteFileExistence(FTPClient ftpClient, String relativePathName)throws FtpException{

        if(relativePathName==null){

            return false;

        }

        String serverBaseDir = ftpConfig.getRemoteBaseDir();

        if(serverBaseDir==null)

           serverBaseDir = ".";

        try {

            int code = ftpClient.rnfr(serverBaseDir+"/"+relativePathName);

            if(code==550)

                return false;

            return true;

        } catch (IOException e) {

            throw new FtpException("FTP operation error.");

        }

    }



    /**

     * Check file existence by using ftp command "RNFR" (rename from)

     * Since no RNTO follows it, there will be no side effect.

     * @param relativePathName

     * @return if remote file/dir exist, return true, otherwise, return false.

     * @throws FtpException

     */

    public boolean checkRemoteFileExistence(String relativePathName)throws FtpException{

        if(relativePathName==null){

            return false;

        }

        FTPClient ftpClient = startClient();

        boolean ret = false;

        try {

            ret = checkRemoteFileExistence(ftpClient, relativePathName);

        }finally{

            disposeClient(ftpClient);

        }

        return ret;

    }





    public String[] listRemoteDir(FTPClient ftpClient, String relativePathName)throws FtpException{

        String serverBaseDir = ftpConfig.getRemoteBaseDir();

        if(serverBaseDir==null)

           serverBaseDir = ".";

        String[] ret = new String[0];

        try {

        	String[] remoteRet = ftpClient.listNames(serverBaseDir+(relativePathName!=null?"/"+relativePathName:""));

            if(remoteRet==null) return ret;

            else if(remoteRet.length>=0)

            {

              ret=getFileNamesWithoutPath(remoteRet);

            }	  

            

            

        } catch (IOException e) {

            throw new FtpException("FTP operation error.");

        }

        return ret;

    }



    public String[] listRemoteDir(String relativePathName)throws FtpException{

        String[] ret = new String[0];

        FTPClient ftpClient = startClient();

        try {

            String[] remoteRet = listRemoteDir(ftpClient, relativePathName);

            if(remoteRet==null) return ret;

            else if(remoteRet.length>=0)

            {

              ret=getFileNamesWithoutPath(remoteRet);

            }	  

        } finally{

            disposeClient(ftpClient);

        }

        return ret;

    }

   public String [] getFileNamesWithoutPath (String [] oFileNames)

   {

	   String[] ret = new String[0];

	   try {

           if(oFileNames==null) return ret;

           else if(oFileNames.length>=0)

           {

             ret= new String[oFileNames.length];

             for (int i = 0; i < oFileNames.length; i++) 

             {

           	  //to get only fileName,not include path

           	  ret[i]=getSingleFileNameWithoutPath(oFileNames[i]);

			  }

           }

	   }

	   catch(Exception e)

	   {

		   e.printStackTrace();

		

	   }	   

	   return ret;

   }

   public String getSingleFileNameWithoutPath(String oFileName)

   {

	   String nFileName="";

	   if(oFileName==null) return nFileName;

	   int markPostion=oFileName.lastIndexOf("/");

	   if(markPostion>=0)

	   {

		   nFileName=oFileName.substring(markPostion+1);

	   }

	   else

	   {

		   nFileName=oFileName;  

	   }

	   return nFileName;

   }



    public static void main(String[] args) {

        FtpOperator oper = new FtpOperator("172.19.64.241","21","root", "nms241");

        String oFileName="d.dat";        

        String nfilename=oper.getSingleFileNameWithoutPath(oFileName);

        System.out.println("nfilename:"+nfilename);

        

        String [] oFileNames= new String[]{oFileName,"ss/ss.csv"};

        String [] nFileNames =oper.getFileNamesWithoutPath(oFileNames);

        for (int i = 0; i < nFileNames.length; i++) {

        	System.out.println("nFileNames["+i+"]:"+nFileNames[i]);

		}

        



    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值