`

Java常用FTP文件操作说明 Apache.FTPClient,ftp4j,jftp

阅读更多

最近因工作需要,数据库中的数据需要从FTP服务中抽取数据文件然后校检再抽取到数据中。因为第一步需要从FTP服务中抽取数据文件。第二步采用JDBC批量数据更新。

1。采用Apache.FTPClient:

/**
 * Apache.FTPClient FTP操作共公类
 * 
 * @author 张明学
 * 
 */
public class FTPCommon {

	private FTPClient ftpClient;

	private FTPModel ftpModel;

	public FTPCommon(FTPModel ftp) {
		super();
		// 从配置文件中读取初始化信息
		this.ftpClient = new FTPClient();
		this.ftpModel = ftp;
	}

	/**
	 * 连接并登录FTP服务器
	 * 
	 */
	public boolean ftpLogin() {
		boolean isLogin = false;
		FTPClientConfig ftpClientConfig = new FTPClientConfig(
				FTPClientConfig.SYST_NT);
		ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID());
		this.ftpClient.setControlEncoding("GBK");
		this.ftpClient.configure(ftpClientConfig);
		try {
			if (this.ftpModel.getPort() > 0) {
				this.ftpClient.connect(ftpModel.getUrl(), ftpModel.getPort());
			} else {
				this.ftpClient.connect(ftpModel.getUrl());
			}
			// FTP服务器连接回答
			int reply = this.ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				this.ftpClient.disconnect();
				return isLogin;
			}
			this.ftpClient.login(this.ftpModel.getUsername(), this.ftpModel
					.getPassword());
			this.ftpClient.changeWorkingDirectory(this.ftpModel.getRemoteDir());
			this.ftpClient.setFileType(FTPClient.FILE_STRUCTURE);
			LogUtil.infoOutPut("成功登陆FTP服务器:" + this.ftpModel.getUrl() + " 端口号:"
					+ this.getFtpModel().getPort() + " 目录:"
					+ this.ftpModel.getRemoteDir());
			isLogin = true;
		} catch (SocketException e) {
			e.printStackTrace();
			LogUtil.logPrint("连接FTP服务失败!", Constants.LOG_EXCEPTION);
			LogUtil.logPrint(e.getMessage(), Constants.LOG_EXCEPTION);
		} catch (IOException e) {
			e.printStackTrace();
			LogUtil.logPrint("登录FTP服务失败!", Constants.LOG_EXCEPTION);
			LogUtil.logPrint(e.getMessage(), Constants.LOG_EXCEPTION);
		}
		System.out.println(this.ftpClient.getBufferSize());
		this.ftpClient.setBufferSize(1024 * 2);
		this.ftpClient.setDataTimeout(2000);
		return isLogin;
	}

	/**
	 * 退出并关闭FTP连接
	 * 
	 */
	public void close() {
		if (null != this.ftpClient && this.ftpClient.isConnected()) {
			try {
				boolean reuslt = this.ftpClient.logout();// 退出FTP服务器
				if (reuslt) {
					LogUtil.info("退出并关闭FTP服务器的连接");
				}
			} catch (IOException e) {
				e.printStackTrace();
				LogUtil.exception("退出FTP服务器异常!");
				LogUtil.exception(e.getMessage());
			} finally {
				try {
					this.ftpClient.disconnect();// 关闭FTP服务器的连接
				} catch (IOException e) {
					e.printStackTrace();
					LogUtil.exception("关闭FTP服务器的连接异常!");
					LogUtil.exception(e.getMessage());
				}
			}
		}
	}

	/**
	 * 检查FTP服务器是否关闭 ,如果关闭接则连接登录FTP
	 * 
	 * @return
	 */
	public boolean isOpenFTPConnection() {
		boolean isOpen = false;
		if (null == this.ftpClient) {
			return false;
		}
		try {
			// 没有连接
			if (!this.ftpClient.isConnected()) {
				isOpen = this.ftpLogin();
			}
		} catch (Exception e) {
			e.printStackTrace();
			LogUtil.exception("FTP服务器连接登录异常!");
			LogUtil.exception(e.getMessage());
			isOpen = false;
		}
		return isOpen;
	}

	/**
	 * 设置传输文件的类型[文本文件或者二进制文件]
	 * 
	 * @param fileType--FTPClient.BINARY_FILE_TYPE,FTPClient.ASCII_FILE_TYPE
	 */
	public void setFileType(int fileType) {
		try {
			this.ftpClient.setFileType(fileType);
		} catch (IOException e) {
			e.printStackTrace();
			LogUtil.exception("设置传输文件的类型异常!");
			LogUtil.exception(e.getMessage());
		}
	}

	/**
	 * 下载文件
	 * 
	 * @param localFilePath
	 *            本地文件名及路径
	 * @param remoteFileName
	 *            远程文件名称
	 * @return
	 */
	public boolean downloadFile(String localFilePath, String remoteFileName) {
		BufferedOutputStream outStream = null;
		boolean success = false;
		try {
			outStream = new BufferedOutputStream(new FileOutputStream(
					localFilePath));
			success = this.ftpClient.retrieveFile(remoteFileName, outStream);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (outStream != null) {
				try {
					outStream.flush();
					outStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return success;
	}

	/**
	 * 下载文件
	 * 
	 * @param localFilePath
	 *            本地文件
	 * @param remoteFileName
	 *            远程文件名称
	 * @return
	 */
	public boolean downloadFile(File localFile, String remoteFileName) {
		BufferedOutputStream outStream = null;
		FileOutputStream outStr = null;
		boolean success = false;
		try {
			outStr = new FileOutputStream(localFile);
			outStream = new BufferedOutputStream(outStr);
			success = this.ftpClient.retrieveFile(remoteFileName, outStream);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != outStream) {
					try {
						outStream.flush();
						outStream.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				if (null != outStr) {
					try {
						outStr.flush();
						outStr.close();
					} catch (IOException e) {
						e.printStackTrace();
					}

				}
			}
		}
		return success;
	}

	/**
	 * 上传文件
	 * 
	 * @param localFilePath
	 *            本地文件路径及名称
	 * @param remoteFileName
	 *            FTP 服务器文件名称
	 * @return
	 */
	public boolean uploadFile(String localFilePath, String remoteFileName) {
		BufferedInputStream inStream = null;
		boolean success = false;
		try {
			inStream = new BufferedInputStream(new FileInputStream(
					localFilePath));
			success = this.ftpClient.storeFile(remoteFileName, inStream);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (inStream != null) {
				try {
					inStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return success;
	}

	/**
	 * 上传文件
	 * 
	 * @param localFilePath
	 *            本地文件
	 * @param remoteFileName
	 *            FTP 服务器文件名称
	 * @return
	 */
	public boolean uploadFile(File localFile, String remoteFileName) {
		BufferedInputStream inStream = null;
		boolean success = false;
		try {
			inStream = new BufferedInputStream(new FileInputStream(localFile));
			success = this.ftpClient.storeFile(remoteFileName, inStream);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (inStream != null) {
				try {
					inStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return success;
	}

	/**
	 * 变更工作目录
	 * 
	 * @param remoteDir--目录路径
	 */
	public void changeDir(String remoteDir) {
		try {
			this.ftpClient.changeWorkingDirectory(remoteDir);
			LogUtil.info("变更工作目录为:" + remoteDir);
		} catch (IOException e) {
			e.printStackTrace();
			LogUtil.exception("变更工作目录为:" + remoteDir + "时出错!");
			LogUtil.exception(e.getMessage());
		}

	}

	/**
	 * 变更工作目录
	 * 
	 * @param remoteDir--目录路径
	 */
	public void changeDir(String[] remoteDirs) {
		String dir = "";
		try {
			for (int i = 0; i < remoteDirs.length; i++) {
				this.ftpClient.changeWorkingDirectory(remoteDirs[i]);
				dir = dir + remoteDirs[i] + "/";
			}
			LogUtil.info("变更工作目录为:" + dir);
		} catch (IOException e) {
			e.printStackTrace();
			LogUtil.exception("变更工作目录为:" + dir + "时出错!");
			LogUtil.exception(e.getMessage());
		}

	}

	/**
	 * 返回上级目录
	 * 
	 */
	public void toParentDir(String[] remoteDirs) {
		try {
			for (int i = 0; i < remoteDirs.length; i++) {
				this.ftpClient.changeToParentDirectory();
			}
			LogUtil.info("返回上级目录");
		} catch (IOException e) {
			e.printStackTrace();
			LogUtil.exception("返回上级目录时出错!");
			LogUtil.exception(e.getMessage());
		}
	}

	/**
	 * 返回上级目录
	 * 
	 */
	public void toParentDir() {
		try {
			this.ftpClient.changeToParentDirectory();
			LogUtil.info("返回上级目录");
		} catch (IOException e) {
			e.printStackTrace();
			LogUtil.exception("返回上级目录时出错!");
			LogUtil.exception(e.getMessage());
		}
	}

	/**
	 * 获得FTP 服务器下所有的文件名列表
	 * 
	 * @param regex
	 * @return
	 */
	public String[] getListFiels() {
		String files[] = null;
		try {
			files = this.ftpClient.listNames();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return files;
	}

	public FTPClient getFtpClient() {
		return ftpClient;
	}

	public FTPModel getFtpModel() {
		return ftpModel;
	}

	public void setFtpModel(FTPModel ftpModel) {
		this.ftpModel = ftpModel;
	}

}

 2。采用FTP4J:

/**
 * ftp4j FTP操作共公类
 * 
 * @author 张明学
 * 
 */
public class FTP4JCommon {
	FTPClient ftpClient = null;

	FTPModel ftpModel = null;

	public FTP4JCommon() {

	}

	public FTP4JCommon(FTPModel ftpModel) {
		this.ftpModel = ftpModel;
	}

	/**
	 * 连接并登录FTP服务器
	 * 
	 */
	public boolean ftpLogin() {
		ftpClient = new FTPClient();
		try {
			// 建立连接
			ftpClient.connect(ftpModel.getUrl());
			ftpClient.setType(FTPClient.TYPE_AUTO);
			ftpClient.setCharset("GBK");
		} catch (Exception e) {
			e.printStackTrace();
			LogUtil.infoOutPut("与FTP服务器建立连接失败!");
			LogUtil.exception(e.getMessage());
		}
		try {
			ftpClient.login(ftpModel.getUsername(), ftpModel.getPassword());
		} catch (Exception e) {
			e.printStackTrace();
			LogUtil.infoOutPut("登录FTP服务器失败!");
			LogUtil.exception(e.getMessage());
		}
		return true;
	}

	/**
	 * 退出并关闭FTP连接
	 * 
	 */
	public void close() {
		if (null != ftpClient) {
			try {
				ftpClient.disconnect(true);
			} catch (Exception e) {
				e.printStackTrace();
				LogUtil.infoOutPut("安全退出FTP服务时异常!");
				LogUtil.exception(e.getMessage());
			}
		}
	}

	/**
	 * 下载文件
	 * 
	 * @param localFilePath
	 *            本地文件名及路径
	 * @param remoteFileName
	 *            远程文件名称
	 * @return
	 * @throws Exception
	 */
	public void downloadFile(String localFilePath, String remoteFileName)
			throws Exception {
		File localFile = new File(localFilePath);
		try {
			ftpClient.download(remoteFileName, localFile);
		} catch (Exception e) {
			e.printStackTrace();
			LogUtil.infoOutPut("下载" + remoteFileName + "时出现异常!");
			LogUtil.exception(e.getMessage());
			throw e;
		}
	}

	/**
	 * 下载文件
	 * 
	 * @param localFilePath
	 *            本地文件名及路径
	 * @param remoteFileName
	 *            远程文件名称
	 * @return
	 * @throws Exception
	 */
	public void downloadFile(File localFile, String remoteFileName)
			throws Exception {
		try {
			ftpClient.download(remoteFileName, localFile);
		} catch (Exception e) {
			e.printStackTrace();
			LogUtil.infoOutPut("下载" + remoteFileName + "时出现异常!");
			LogUtil.exception(e.getMessage());
			throw e;
		}
	}

	/**
	 * 获得FTP 服务器下所有的文件名列表
	 * 
	 * @param regex
	 * @return
	 */
	public String[] getListFiels() {
		String fileNames[] = null;
		try {
			fileNames = this.ftpClient.listNames();
		} catch (Exception e) {
			e.printStackTrace();
			LogUtil.infoOutPut("获取文件名列表时出现异常!");
			LogUtil.exception(e.getMessage());
		}
		return fileNames;
	}

	public FTPModel getFtpModel() {
		return ftpModel;
	}

	public void setFtpModel(FTPModel ftpModel) {
		this.ftpModel = ftpModel;
	}

	public FTPClient getFtpClient() {
		return ftpClient;
	}

}

 3。采用:jftp下载

/**
 * jftp FTP下载操作
 * 
 * @author 张明学
 * 
 */
public class JFTPDownloadCommon implements ConnectionListener {

	private boolean isThere = false;

	public static long time = 0;

	private FTPModel ftpModel = null;

	private ConnectionHandler handler = new ConnectionHandler();

	private FtpConnection ftpcon = null;

	public JFTPDownloadCommon(FTPModel ftpModel) {
		this.ftpModel = ftpModel;
		// 登录FTP
		this.ftpLogin();
	}

	/**
	 * 连接并登录FTP服务器
	 * 
	 */
	public boolean ftpLogin() {
		ftpcon = new FtpConnection(this.ftpModel.getUrl());
		ftpcon.addConnectionListener(this);
		ftpcon.setConnectionHandler(handler);
		// 登录
		ftpcon.login(ftpModel.getUsername(), ftpModel.getPassword());
		while (!isThere) {
			try {
				Thread.sleep(10);
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
		LogUtil.infoOutPut("是否登录成功:" + isThere);
		return isThere;
	}

	/**
	 * 关闭与FTP服务器的连接
	 * 
	 */
	public void close() {
		ftpcon.disconnect();
		LogUtil.infoOutPut("关闭与FTP的连接");
	}

	/**
	 * 获得FTP 服务器下所有的文件名列表
	 * 
	 * @param regex
	 * @return
	 */
	public String[] getListFiels() {
		ftpcon.exists("");
		Vector fileNameVector = ftpcon.currentFiles;
		String[] fileNames = new String[fileNameVector.size()];
		int i = 0;
		for (Iterator iter = fileNameVector.iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			fileNames[i] = name;
			i++;
		}
		return fileNames;
	}

	/**
	 * 将FTP服务器上的file下载为bype型数据
	 * 
	 * @param remoteFileName
	 *            文件名
	 * @return
	 */
	public byte[] downloadToBinary(String remoteFileName) {
		Settings.bufferSize = 16384;
		long current = System.currentTimeMillis();
		byte[] bytes = null;
		try {
			InputStream is = ftpcon.getDownloadInputStream(remoteFileName);
			ByteArrayOutputStream bais = new ByteArrayOutputStream();
			int bit = 0;
			while ((bit = is.read()) != -1) {
				bais.write(bit);
			}
			bytes = bais.toByteArray();
		} catch (Exception e) {
		}
		time = (System.currentTimeMillis() - current);
		System.out.println("下载花费时间:" + time + "ms.");
		return bytes;
	}

	/**
	 * 下载FTP服务器文件
	 * 
	 * @param remoteFileName
	 *            FTP服务器文件名
	 * @param localFile
	 *            本地文件名
	 * @return
	 * @throws Exception
	 */
	public void downloadToBinary(String remoteFileName, File localFile)
			throws Exception {
		Settings.bufferSize = 16384;
		byte[] bytes = null;
		InputStream is = ftpcon.getDownloadInputStream(remoteFileName);
		ByteArrayOutputStream bais = new ByteArrayOutputStream();
		int bit = 0;
		while ((bit = is.read()) != -1) {
			bais.write(bit);
		}
		bytes = bais.toByteArray();
		CopyByteDataToLoacal(localFile, bytes);

	}

	/**
	 * 将二进制文件下载到本地
	 * 
	 * @param localFile
	 *            目标文件名
	 * @param fileDatas
	 *            文件数据
	 * @throws IOException
	 */
	public void CopyByteDataToLoacal(File localFile, byte[] fileDatas)
			throws IOException {
		FileOutputStream fileOutStream = null;
		BufferedOutputStream bufferOutStream = null;
		try {
			if (localFile.exists()) {
				localFile.delete();
			}
			fileOutStream = new FileOutputStream(localFile);
			bufferOutStream = new BufferedOutputStream(fileOutStream);
			bufferOutStream.write(fileDatas);
		} catch (FileNotFoundException e) {
			LogUtil.exception(e.getMessage());
			throw e;
		} catch (IOException e) {
			LogUtil.exception(e.getMessage());
			throw e;
		} finally {
			try {
				if (null != bufferOutStream) {
					bufferOutStream.flush();
					bufferOutStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (null != fileOutStream) {
					try {
						fileOutStream.flush();
						fileOutStream.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}

	public void connectionFailed(BasicConnection arg0, String arg1) {
		LogUtil.infoOutPut("与FTP服务器连接失败!");
	}

	public void connectionInitialized(BasicConnection arg0) {
		isThere = true;
	}

	public void updateRemoteDirectory(BasicConnection arg0) {
	}

	public void updateProgress(String arg0, String arg1, long arg2) {
	}

	public void actionFinished(BasicConnection arg0) {
	}

}

上面都用到了一个ftpModel如下(get,set方法省了):

/**
 * FTP实体对象
 * 
 * @author 张明学
 * 
 */
public class FTPModel {

	private String ftpId;

	private String username;

	private String password;

	private String url;

	private int port;

	private String remoteDir;

	public FTPModel() {

	}

	public FTPModel(String username, String password, String url, int port,
			String remoteDir) {
		this.username = username;
		this.password = password;
		this.url = url;
		this.port = port;
		this.remoteDir = remoteDir;
	}
}
 

上述仅仅列出了一点常用的操作,更多的操作需要参看它的们API文件。

 

还有,我采用的Serv-U作为FTP服务器,按装之后新建用户不法登录。后来找到了原因是:要把IIS服务中的FTP服务关掉。

 

5
2
分享到:
评论
6 楼 sking945 2015-08-21  
感谢!提供jar包!
5 楼 12345678 2011-12-26  
感谢!!!!
4 楼 zzlong 2011-04-16  
请问LogUtil类是自己写的吗?
3 楼 xiaobojava 2010-07-31  
可以,可以更换目录
/** 
277.     * 变更工作目录 
278.     *  
279.     * @param remoteDir--目录路径 
280.     */ 
281.    public void changeDir(String remoteDir) {  
282.        try {  
283.            this.ftpClient.changeWorkingDirectory(remoteDir);  
284.            LogUtil.info("变更工作目录为:" + remoteDir);  
285.        } catch (IOException e) {  
286.            e.printStackTrace();  
287.            LogUtil.exception("变更工作目录为:" + remoteDir + "时出错!");  
288.            LogUtil.exception(e.getMessage());  
289.        }  
290. 
291.    }  
2 楼 zhanglongchao 2010-07-30  
  public String[] getListFiels() {  
        String files[] = null;  
        try {  
            files = this.ftpClient.listNames();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return files;  
    }  
这个方法只能获取一级目录下的文件名称,如何目录层次多了又如何办了?
1 楼 zhanglongchao 2010-07-30  
我想问一下,如何ftp服务器上的目录中包括多个子目录,子目录中还有文件,如何把这些名称都拿出来啊

相关推荐

Global site tag (gtag.js) - Google Analytics