- 浏览: 15070 次
- 性别:
- 来自: 杭州
文章分类
最新评论
该版本主要增加了以下特性:
1、对多线程并发的支持
2、连接复用
1、对多线程并发的支持
2、连接复用
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import org.apache.log4j.Logger; /** * FTP客户端 * * @author summersun_ym * @version $Id: FTPClientTemplate.java 2010-11-22 上午12:54:47 $ */ public class FTPClientTemplate { //--------------------------------------------------------------------- // Instance data //--------------------------------------------------------------------- /** logger */ protected final Logger log = Logger.getLogger(getClass()); private ThreadLocal<FTPClient> ftpClientThreadLocal = new ThreadLocal<FTPClient>(); private String host; private int port; private String username; private String password; private boolean binaryTransfer = true; private boolean passiveMode = true; private String encoding = "UTF-8"; private int clientTimeout = 1000 * 30; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public boolean isBinaryTransfer() { return binaryTransfer; } public void setBinaryTransfer(boolean binaryTransfer) { this.binaryTransfer = binaryTransfer; } public boolean isPassiveMode() { return passiveMode; } public void setPassiveMode(boolean passiveMode) { this.passiveMode = passiveMode; } public String getEncoding() { return encoding; } public void setEncoding(String encoding) { this.encoding = encoding; } public int getClientTimeout() { return clientTimeout; } public void setClientTimeout(int clientTimeout) { this.clientTimeout = clientTimeout; } //--------------------------------------------------------------------- // private method //--------------------------------------------------------------------- /** * 返回一个FTPClient实例 * * @throws FTPClientException */ private FTPClient getFTPClient() throws FTPClientException { if (ftpClientThreadLocal.get() != null && ftpClientThreadLocal.get().isConnected()) { return ftpClientThreadLocal.get(); } else { FTPClient ftpClient = new FTPClient(); //构造一个FtpClient实例 ftpClient.setControlEncoding(encoding); //设置字符集 connect(ftpClient); //连接到ftp服务器 //设置为passive模式 if (passiveMode) { ftpClient.enterLocalPassiveMode(); } setFileType(ftpClient); //设置文件传输类型 try { ftpClient.setSoTimeout(clientTimeout); } catch (SocketException e) { throw new FTPClientException("Set timeout error.", e); } ftpClientThreadLocal.set(ftpClient); return ftpClient; } } /** * 设置文件传输类型 * * @throws FTPClientException * @throws IOException */ private void setFileType(FTPClient ftpClient) throws FTPClientException { try { if (binaryTransfer) { ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); } else { ftpClient.setFileType(FTPClient.ASCII_FILE_TYPE); } } catch (IOException e) { throw new FTPClientException("Could not to set file type.", e); } } /** * 连接到ftp服务器 * * @param ftpClient * @return 连接成功返回true,否则返回false * @throws FTPClientException */ private boolean connect(FTPClient ftpClient) throws FTPClientException { try { ftpClient.connect(host, port); // 连接后检测返回码来校验连接是否成功 int reply = ftpClient.getReplyCode(); if (FTPReply.isPositiveCompletion(reply)) { //登陆到ftp服务器 if (ftpClient.login(username, password)) { setFileType(ftpClient); return true; } } else { ftpClient.disconnect(); throw new FTPClientException("FTP server refused connection."); } } catch (IOException e) { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); //断开连接 } catch (IOException e1) { throw new FTPClientException("Could not disconnect from server.", e1); } } throw new FTPClientException("Could not connect to server.", e); } return false; } //--------------------------------------------------------------------- // public method //--------------------------------------------------------------------- /** * 断开ftp连接 * * @throws FTPClientException */ public void disconnect() throws FTPClientException { try { FTPClient ftpClient = getFTPClient(); ftpClient.logout(); if (ftpClient.isConnected()) { ftpClient.disconnect(); ftpClient = null; } } catch (IOException e) { throw new FTPClientException("Could not disconnect from server.", e); } } public boolean mkdir(String pathname) throws FTPClientException { return mkdir(pathname, null); } /** * 在ftp服务器端创建目录(不支持一次创建多级目录) * * 该方法执行完后将自动关闭当前连接 * * @param pathname * @return * @throws FTPClientException */ public boolean mkdir(String pathname, String workingDirectory) throws FTPClientException { return mkdir(pathname, workingDirectory, true); } /** * 在ftp服务器端创建目录(不支持一次创建多级目录) * * @param pathname * @param autoClose 是否自动关闭当前连接 * @return * @throws FTPClientException */ public boolean mkdir(String pathname, String workingDirectory, boolean autoClose) throws FTPClientException { try { getFTPClient().changeWorkingDirectory(workingDirectory); return getFTPClient().makeDirectory(pathname); } catch (IOException e) { throw new FTPClientException("Could not mkdir.", e); } finally { if (autoClose) { disconnect(); //断开连接 } } } /** * 上传一个本地文件到远程指定文件 * * @param remoteAbsoluteFile 远程文件名(包括完整路径) * @param localAbsoluteFile 本地文件名(包括完整路径) * @return 成功时,返回true,失败返回false * @throws FTPClientException */ public boolean put(String remoteAbsoluteFile, String localAbsoluteFile) throws FTPClientException { return put(remoteAbsoluteFile, localAbsoluteFile, true); } /** * 上传一个本地文件到远程指定文件 * * @param remoteAbsoluteFile 远程文件名(包括完整路径) * @param localAbsoluteFile 本地文件名(包括完整路径) * @param autoClose 是否自动关闭当前连接 * @return 成功时,返回true,失败返回false * @throws FTPClientException */ public boolean put(String remoteAbsoluteFile, String localAbsoluteFile, boolean autoClose) throws FTPClientException { InputStream input = null; try { // 处理传输 input = new FileInputStream(localAbsoluteFile); getFTPClient().storeFile(remoteAbsoluteFile, input); log.debug("put " + localAbsoluteFile); return true; } catch (FileNotFoundException e) { throw new FTPClientException("local file not found.", e); } catch (IOException e) { throw new FTPClientException("Could not put file to server.", e); } finally { try { if (input != null) { input.close(); } } catch (Exception e) { throw new FTPClientException("Couldn't close FileInputStream.", e); } if (autoClose) { disconnect(); //断开连接 } } } /** * 下载一个远程文件到本地的指定文件 * * @param remoteAbsoluteFile 远程文件名(包括完整路径) * @param localAbsoluteFile 本地文件名(包括完整路径) * @return 成功时,返回true,失败返回false * @throws FTPClientException */ public boolean get(String remoteAbsoluteFile, String localAbsoluteFile) throws FTPClientException { return get(remoteAbsoluteFile, localAbsoluteFile, true); } /** * 下载一个远程文件到本地的指定文件 * * @param remoteAbsoluteFile 远程文件名(包括完整路径) * @param localAbsoluteFile 本地文件名(包括完整路径) * @param autoClose 是否自动关闭当前连接 * * @return 成功时,返回true,失败返回false * @throws FTPClientException */ public boolean get(String remoteAbsoluteFile, String localAbsoluteFile, boolean autoClose) throws FTPClientException { OutputStream output = null; try { output = new FileOutputStream(localAbsoluteFile); return get(remoteAbsoluteFile, output, autoClose); } catch (FileNotFoundException e) { throw new FTPClientException("local file not found.", e); } finally { try { if (output != null) { output.close(); } } catch (IOException e) { throw new FTPClientException("Couldn't close FileOutputStream.", e); } } } /** * 下载一个远程文件到指定的流 处理完后记得关闭流 * * @param remoteAbsoluteFile * @param output * @return * @throws FTPClientException */ public boolean get(String remoteAbsoluteFile, OutputStream output) throws FTPClientException { return get(remoteAbsoluteFile, output, true); } /** * 下载一个远程文件到指定的流 处理完后记得关闭流 * * @param remoteAbsoluteFile * @param output * @param delFile * @return * @throws FTPClientException */ public boolean get(String remoteAbsoluteFile, OutputStream output, boolean autoClose) throws FTPClientException { try { FTPClient ftpClient = getFTPClient(); // 处理传输 return ftpClient.retrieveFile(remoteAbsoluteFile, output); } catch (IOException e) { throw new FTPClientException("Couldn't get file from server.", e); } finally { if (autoClose) { disconnect(); //关闭链接 } } } /** * 从ftp服务器上删除一个文件 * 该方法将自动关闭当前连接 * * @param delFile * @return * @throws FTPClientException */ public boolean delete(String delFile) throws FTPClientException { return delete(delFile, true); } /** * 从ftp服务器上删除一个文件 * * @param delFile * @param autoClose 是否自动关闭当前连接 * * @return * @throws FTPClientException */ public boolean delete(String delFile, boolean autoClose) throws FTPClientException { try { getFTPClient().deleteFile(delFile); return true; } catch (IOException e) { throw new FTPClientException("Couldn't delete file from server.", e); } finally { if (autoClose) { disconnect(); //关闭链接 } } } /** * 批量删除 * 该方法将自动关闭当前连接 * * @param delFiles * @return * @throws FTPClientException */ public boolean delete(String[] delFiles) throws FTPClientException { return delete(delFiles, true); } /** * 批量删除 * * @param delFiles * @param autoClose 是否自动关闭当前连接 * * @return * @throws FTPClientException */ public boolean delete(String[] delFiles, boolean autoClose) throws FTPClientException { try { FTPClient ftpClient = getFTPClient(); for (String s : delFiles) { ftpClient.deleteFile(s); } return true; } catch (IOException e) { throw new FTPClientException("Couldn't delete file from server.", e); } finally { if (autoClose) { disconnect(); //关闭链接 } } } /** * 列出远程默认目录下所有的文件 * * @return 远程默认目录下所有文件名的列表,目录不存在或者目录下没有文件时返回0长度的数组 * @throws FTPClientException */ public String[] listNames() throws FTPClientException { return listNames(null, true); } public String[] listNames(boolean autoClose) throws FTPClientException { return listNames(null, autoClose); } /** * 列出远程目录下所有的文件 * * @param remotePath 远程目录名 * @param autoClose 是否自动关闭当前连接 * * @return 远程目录下所有文件名的列表,目录不存在或者目录下没有文件时返回0长度的数组 * @throws FTPClientException */ public String[] listNames(String remotePath, boolean autoClose) throws FTPClientException { try { String[] listNames = getFTPClient().listNames(remotePath); return listNames; } catch (IOException e) { throw new FTPClientException("列出远程目录下所有的文件时出现异常", e); } finally { if (autoClose) { disconnect(); //关闭链接 } } } public static void main(String[] args) throws FTPClientException, InterruptedException { FTPClientTemplate ftp = new FTPClientTemplate(); ftp.setHost("localhost"); ftp.setPort(2121); ftp.setUsername("admin"); ftp.setPassword("admin"); ftp.setBinaryTransfer(false); ftp.setPassiveMode(false); ftp.setEncoding("utf-8"); //boolean ret = ftp.put("/group/tbdev/query/user-upload/12345678910.txt", "D:/099_temp/query/12345.txt"); //System.out.println(ret); ftp.mkdir("asd", "user-upload"); //ftp.disconnect(); //ftp.mkdir("user-upload1"); //ftp.disconnect(); //String[] aa = {"/group/tbdev/query/user-upload/123.txt", "/group/tbdev/query/user-upload/SMTrace.txt"}; //ftp.delete(aa); } }
相关推荐
Java FTP客户端源代码是用于通过Java编程语言与FTP(文件传输协议)服务器进行交互的程序。FTP是一种在互联网上常用的标准文件传输协议,允许用户上传、下载和管理远程服务器上的文件。Java提供了一系列的API,如`...
Java作为一种通用的、面向对象的编程语言,提供了丰富的库来支持FTP客户端和服务端的实现。 在Java中,我们可以使用`java.net.Socket`类来创建客户端连接,它代表了两台机器之间的网络连接。Socket编程是基于TCP/IP...
在这个“java FTP客户端程序”中,我们可以深入探讨如何使用Java来编写一个FTP客户端,以及涉及到的相关知识点。 首先,我们需要了解Java中的`java.net`和`java.io`这两个核心库,它们是实现FTP客户端的基础。`java...
4. **文件传输**:Java FTP客户端支持ASCII和二进制模式的文件传输。ASCII模式适用于文本文件,而二进制模式适用于所有其他类型的文件,如图片、音频或程序文件。 5. **断点续传**:高级FTP客户端可能包含断点续传...
ftp 客户端代码 java Jftp.java
JavaFTP客户端是基于Java语言实现的FTP(File Transfer Protocol)客户端程序,用于在本地计算机与远程服务器之间进行文件传输操作。FTP是一种应用层协议,它允许用户从一台计算机(客户端)向另一台计算机(服务器...
在`ftpclient.txt`文件中,可能包含了一个简单的Java FTP客户端实现代码示例,演示了如何连接FTP服务器、上传和下载文件。通常,一个基本的FTP客户端程序会包含以下步骤: 1. 创建`FTPClient`对象。 2. 连接服务器,...
这个"ftp.java"源代码文件很可能是实现了以上功能的一个FTP客户端程序。通过阅读和理解源代码,开发者可以学习到如何在Java中构建一个基本的FTP客户端,并将其应用于实际的文件传输场景。同时,这也是一个很好的学习...
为了深入理解并运行这个Java FTP客户端程序,你需要解压文件,查看源代码(如果存在),理解配置文件的格式,并根据需要配置服务器信息。如果你对Java编程和FTP协议有基础,那么分析和运行这个程序将会是一项有趣的...
一段用java实现的ftp客户端代码,是用来学习的好例子!!!
这是简单的FTP客户端的java代码 简单易学好用
用java实现的ftp客户端,功能完善,可以实现上传、下载、新建远程文件夹、删除、修改远程目录等功能,端口号默认为20,可以在网络设置界面修改。底层采用socket传输数据。带源码,注释相当详细。
为了全面理解这个Java FTP客户端,你需要阅读提供的文档,查看源代码,并了解如何使用FTP库来实现FTP协议的不同功能。这个项目对于学习网络编程和FTP协议是一个很好的实践,同时也可以加深对Java I/O和网络编程的...
在本文中,我们将深入探讨FTP服务端、FTP客户端以及如何在Java环境中实现FTP客户端。 FTP服务端是运行在服务器上的软件,它接收来自客户端的连接请求,处理文件传输操作,并管理用户权限。在Java中,可以使用Apache...
Java开发FTP客户端是一种常见的编程任务,它涉及到网络通信和文件操作等核心技能。FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议,而使用Java来实现FTP客户端则需要掌握Java的Socket编程...
Java FTP客户端程序源码是用于实现文件传输协议(FTP)的软件组件,它允许开发者通过编程方式与FTP服务器进行交互,实现文件的上传、下载以及目录管理等操作。在Java中,可以使用如Apache Commons Net库这样的第三方...
1.实现一个图形用户界面的FTP客户端。 2.功能: 2.1 配置使用IIS的FTP服务器; 2.2 客户端发出各种操作命令;至少实现conn(连接)、list(列示文件)、retr(下载)、store(上载)的功能。 2.3 接收服务器的操作...
【标题】"JAVA Swing FTP客户端实现详解" 在Java编程领域,Swing库是用于构建桌面应用程序用户界面的强大工具。此项目“JAVA Swing (MVC) FTP客户端”是基于Swing和FTP协议创建的一个桌面应用程序,它允许用户进行...
总之,这段Java代码展示了如何使用内置的`FtpClient`实现一个简单的FTP客户端,执行基本的文件上传和下载任务。然而,为了在生产环境中构建可靠的FTP客户端,可能需要考虑更多的异常处理、错误报告、连接重试机制...