最近因工作需要,数据库中的数据需要从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服务关掉。