java ftp客戶端

最近打算做一个android上的ftp客户端工具,网上搜索了一下,发现apache commons-net可以很方便的实现,但是这个第三方包中对文件夹的删除与创建(级联)操作并不是特别的方便。删除文件夹必须保证该文件夹下没有任何文件,创建文件夹也必须要求父文件夹存在。为了方便以后使用方便,对其进行了简单的封装,主要针对删除与文件夹创建。代码如下:


package cn.androiddevelop.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

/**
 * ftp客户端
 * 
 * @author Yuedong Li
 * 
 */
public class FtpClient {
	private FTPClient client;

	public FtpClient(String host, String userName, String password)
			throws SocketException, IOException {
		initFtpClient(host, 21, userName, password);
	}

	public FtpClient(String host, int port, String userName, String password)
			throws SocketException, IOException {
		initFtpClient(host, port, userName, password);
	}

	/**
	 * 登录
	 * 
	 * @param host
	 * @param port
	 * @param userName
	 * @param password
	 * @throws SocketException
	 * @throws IOException
	 */
	public void initFtpClient(String host, int port, String userName,
			String password) throws SocketException, IOException {
		client = new FTPClient();
		client.connect(host, port);
		client.login(userName, password);
	}

	/**
	 * 得到所有目录
	 * 
	 * @param remotePath
	 * @return
	 * @throws IOException
	 */
	public FTPFile[] listFiles(String remotePath) throws IOException {
		if (client == null)
			return null;
		client.changeWorkingDirectory(remotePath);
		return client.listFiles();
	}

	/**
	 * 上传
	 * 
	 * @param localPath
	 *            本地路径
	 * @param remotePath
	 *            ftp路径
	 * @return 上传是否成功
	 * @throws IOException
	 */
	public boolean upload(String localPath, String remotePath)
			throws IOException {
		if (client == null)
			return false;
		boolean res = false;
		FileInputStream fileInputStream = new FileInputStream(localPath);
		int index = remotePath.lastIndexOf('/');
		if (index != -1) {
			client.setFileType(FTP.BINARY_FILE_TYPE);
			client.changeWorkingDirectory(remotePath.substring(0, index));
			res = client.storeFile(remotePath.substring(index + 1),
					fileInputStream);
		}
		fileInputStream.close();
		return res;
	}

	/**
	 * 下载
	 * 
	 * @param remotePath
	 *            ftp路径
	 * @param localPath
	 *            本地路径
	 * @return 下载是否成功
	 * @throws IOException
	 */
	public boolean download(String remotePath, String localPath)
			throws IOException {
		if (client == null)
			return false;
		boolean res = false;
		FileOutputStream fileOutputStream = new FileOutputStream(localPath);
		res = client.retrieveFile(remotePath, fileOutputStream);
		fileOutputStream.flush();
		fileOutputStream.close();
		return res;

	}

	/**
	 * 删除文件
	 * 
	 * @param remotePath ftp端路径
	 * @return
	 * @throws IOException
	 */
	public boolean delete(String remotePath) throws IOException {
		if (client == null)
			return false;

		return client.deleteFile(remotePath) || deleteDirectory(remotePath);
	}

	/**
	 * 创建目录
	 * 
	 * @param remotePath
	 * @throws IOException
	 */
	public boolean makeDirectory(String remotePath) throws IOException {
		if (client == null)
			return false;

		String[] item = remotePath.split("/");
		String currentPath = "";
		for (int i = 0; i < item.length - 1; i++) {
			currentPath = currentPath + "/" + item[i];
			client.makeDirectory(currentPath);
		}

		return client.makeDirectory(remotePath);
	}


	/**
	 * 删除文件
	 * 
	 * @param remotePath ftp端路径
	 * @return
	 * @throws IOException
	 */
	private boolean deleteDirectory(String remotePath) throws IOException {
		FTPFile[] files = listFiles(remotePath);
		for (int i = 0; i < files.length; i++) {
			if (files[i].isDirectory()) {
				deleteDirectory(remotePath + "/" + files[i].getName());
			} else {
				client.deleteFile(remotePath + "/" + files[i].getName());
			}
		}
		return client.removeDirectory(remotePath);
	}

	/**
	 * 重命名
	 * 
	 * @param remoteOldPath 
	 * @param remoteNewPath
	 * @return
	 * @throws IOException
	 */
	public boolean rename(String remoteOldPath, String remoteNewPath)
			throws IOException {
		if (client == null)
			return false;
		return client.rename(remoteOldPath, remoteNewPath);
	}

	/**
	 * 退出登录
	 * 
	 * @throws IOException
	 */
	public void close() throws IOException {
		if (client != null)
			client.logout();
	}
}


代码整体不多,有什么问题欢迎留言。

你可能感兴趣的:(java ftp客戶端)