使用jdk7用于连接和操作ftp服务器
package com.voiinnov.xingye.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import sun.net.ftp.FtpClient;
import sun.net.ftp.FtpDirEntry;
import sun.net.ftp.FtpProtocolException;
public class FtpClientUtil {
private FtpClient ftpClient;
public FtpClient getFtpClient(){
return this.ftpClient;
}
/**
* 连接FTP服务器
* @param ip ip地址
* @param port 端口号
* @param user 用户名
* @param password 密码
* @param path FTP的根目录
*/
public void connectServer(String ip, int port, String user, String password, String path) {
try {
/* ******连接服务器的两种方法*******/
ftpClient = FtpClient.create();
try {
SocketAddress addr = new InetSocketAddress(ip,port);
ftpClient.connect(addr);
ftpClient.login(user, password.toCharArray());
System.out.println("login success!");
用2进制上传、下载
ftpClient.setBinaryType();
if (path!=null&&path.length() != 0){
//把远程系统上的目录切换到参数path所指定的目录
ftpClient.changeDirectory(path);
}
} catch (FtpProtocolException e) {
e.printStackTrace();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* 关闭连接
*/
public void closeConnect() {
try {
ftpClient.close();
System.out.println("disconnect success");
} catch (IOException ex) {
System.out.println("not disconnect");
ex.printStackTrace();
}
}
/**
* 上传文件使用流
* @param localFile
* @param remoteFile
*/
public void uploadStream(String localFile, String remoteFile){
FileInputStream is = null;
File file_in = new File(localFile);
try {
is = new FileInputStream(file_in);
ftpClient.putFile(remoteFile, is);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (FtpProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 上传文件
* @param localFile 本地文件
* @param remoteFile 远程文件
*/
public void upload(String localFile, String remoteFile) {
//this.localfilename = localFile;
//this.remotefilename = remoteFile;
OutputStream os = null;
FileInputStream is = null;
try {
//将远程文件加入输出流中
try {
os = ftpClient.putFileStream(remoteFile);
} catch (
FtpProtocolException e) {
e.printStackTrace();
}
//获取本地文件的输入流
File file_in = new File(localFile);
is = new FileInputStream(file_in);
//创建一个缓冲区
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
System.out.println("upload success");
} catch (IOException ex) {
System.out.println("not upload");
ex.printStackTrace();
} finally{
try {
if(is != null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(os != null){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 下载文件
* @param remoteFile 远程文件路径(服务器端)
* @param localFile 本地文件路径(客户端)
*/
public void download(String remoteFile, String localFile) {
InputStream is = null;
FileOutputStream os = null;
try {
//获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。
try {
is = ftpClient.getFileStream(remoteFile);
} catch (FtpProtocolException e) {
e.printStackTrace();
}
File file_in = new File(localFile);
os = new FileOutputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
System.out.println("download success");
} catch (IOException ex) {
System.out.println("not download");
ex.printStackTrace();
} finally{
try {
if(is != null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(os != null){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
*
* @param remoteFile
* @return
*/
public String downFile2String(String remoteFile){
InputStream is = null;
StringBuffer sb = null;
BufferedReader bufferReader = null;
try {
is = ftpClient.getFileStream(remoteFile);
sb = new StringBuffer();
bufferReader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = bufferReader.readLine()) != null) {
System.out.println("读取的数据:"+line);
sb.append(line+"\n");
}
} catch (FtpProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sb.toString();
}
/**
* 判断FTP服务器已经连接并且登陆
* @return
*/
private boolean isConAndLogin(){
boolean flag = false;
flag =ftpClient.isLoggedIn()&&ftpClient.isConnected();
return flag ;
}
/**
* 创建目录
* @param path 目录名
* <br/>
* 如果需要一次性创建多个目录,可以使用这种字符串“test/test1/test2”直接创建多个目录
*/
public void makeDir(String path){
try {
if(isConAndLogin()){
ftpClient.makeDirectory(path);
}else{
System.out.println("FTP没有连接成功");
}
} catch (FtpProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 重命名
* @param sPath 源文件名
* @param dPath 目标文件名
*/
public void renameDir(String sPath , String dPath ){
try {
if(isConAndLogin()){
ftpClient.rename(sPath, dPath);
}else{
System.out.println("FTP没有连接成功");
}
} catch (FtpProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 递归删除文件夹
* @param path
*/
public void deleteDirs(String path) {
try {
Iterator<FtpDirEntry> dirEntryI =getFtpClient().listFiles(path);
if(dirEntryI.hasNext()){
FtpDirEntry entry = null;
while(dirEntryI.hasNext()){
entry = dirEntryI.next();
//System.out.println(entry.getType()+" "+entry.getName());
if(entry.getType()==FtpDirEntry.Type.DIR){
this.deleteDirs(path+File.separator+entry.getName());
getFtpClient().removeDirectory(path+File.separator+entry.getName());
}else{
getFtpClient().deleteFile(path+File.separator+entry.getName());
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 删除文件夹(删除的时候文件夹必须为空)
* @param path
*/
public void delDir(String path){
try {
if(isConAndLogin()){
ftpClient.removeDirectory(path);
}else{
System.out.println("FTP没有连接成功");
}
} catch (FtpProtocolException e) {
System.out.println("没有连接");
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 测试删除文件夹
*/
public static void testDleDir(){
FtpClientUtil fu = new FtpClientUtil();
/* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器 */
fu.connectServer("127.0.0.1", 21, "test", "test", null);
String path = "20140512_back";
fu.deleteDirs(path);
fu.delDir(path);
fu.closeConnect();
}
/**
* 测试重命名文件夹
*/
public static void testRenameDir(){
FtpClientUtil fu = new FtpClientUtil();
/* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器 */
fu.connectServer("127.0.0.1", 21, "test", "test", null);
String spath = "20150521";
String dpath = "20140512_back";
fu.renameDir(spath, dpath);
fu.closeConnect();
}
/**
* 测试单个文件上传
*/
public static void testSigleUplad(){
Date now = new Date();
SimpleDateFormat sDateFormat = new SimpleDateFormat();
sDateFormat.applyPattern("yyyyMMdd");
String dir = "/"+sDateFormat.format(now);
FtpClientUtil fu = new FtpClientUtil();
/* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器 */
fu.connectServer("127.0.0.1", 21, "test", "test", null);
dir=dir+"/xingyeblank";
//在FTP创建文件夹
fu.makeDir(dir);
//本地文件
String localfile = "E:/test/ZXRZ_900201_TKSQ_20150521.txt";
//上传到ftp远程文件
String remotefile = dir+"/ZXRZ_900201_TKSQ_20150521.txt";
//上传
sDateFormat.applyPattern("yyyy-MM-dd hh:mm:ss");
System.out.println(sDateFormat.format(new java.util.Date()));// new Date()为获取当前系统时间
fu.upload(localfile, remotefile);
System.out.println(sDateFormat.format(new java.util.Date()));// new Date()为获取当前系统时间
fu.closeConnect();
}
/**
* 测试单个文件上传
*/
public static void testSigleUplad2(){
Date now = new Date();
SimpleDateFormat sDateFormat = new SimpleDateFormat();
sDateFormat.applyPattern("yyyyMMdd");
String dir = "/"+sDateFormat.format(now);
FtpClientUtil fu = new FtpClientUtil();
/* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器 */
fu.connectServer("127.0.0.1", 21, "test", "test", null);
dir=dir+"/xingyeblank";
//在FTP创建文件夹
fu.makeDir(dir);
//本地文件
String localfile = "E:/test/ZXRZ_900201_TKSQ_20150521.txt";
//上传到ftp远程文件
String remotefile = dir+"/ZXRZ_900201_TKSQ_20150521.txt";
//上传
sDateFormat.applyPattern("yyyy-MM-dd hh:mm:ss");
System.out.println(sDateFormat.format(new java.util.Date()));// new Date()为获取当前系统时间
fu.uploadStream(localfile, remotefile);
System.out.println(sDateFormat.format(new java.util.Date()));// new Date()为获取当前系统时间
fu.closeConnect();
}
/**
* 测试文件加载
*/
public static void testDownFile(){
//下载到本地文件
String localfile = "E:/test/AESUtils副本3333.java";
//ftp远程文件
String remotefile = "20150521/xingyeblank/AESUtils111.java";
FtpClientUtil fu = new FtpClientUtil();
/* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器 */
fu.connectServer("127.0.0.1", 21, "test", "test", null);
fu.download(remotefile, localfile);
}
public static void testDownFile2String(){
//ftp远程文件
String remoteFile = "20150521/xingyeblank/ZXRZ_900201_TKSQ_20150521.txt";
FtpClientUtil fu = new FtpClientUtil();
/* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器 */
fu.connectServer("127.0.0.1", 21, "test", "test", null);
String str = fu.downFile2String(remoteFile);
System.out.println(str);
}
/**
* 测试创建文件夹
*/
public static void testMakeDir(){
FtpClientUtil fu = new FtpClientUtil();
/* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器 */
fu.connectServer("127.0.0.1", 21, "test", "test", null);
try {
fu.getFtpClient().makeDirectory("20150521/test");
fu.getFtpClient().makeDirectory("20150521/test2");
fu.getFtpClient().makeDirectory("20150521/test3");
fu.getFtpClient().makeDirectory("20150521/test4");
fu.getFtpClient().makeDirectory("20150521/test5");
fu.closeConnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String agrs[]) {
//testSigleUplad();
//testMakeDir();
//testRenameDir();
//testDleDir();
//testDownFile();
//testDownFile2String();
testSigleUplad2();
//---------------其他方法的说明----------------
//从FTP下载指定的文件到OutputStream下
//ftpClient.getFile(String remotePath, OutputStream);
//如果是文件名列出文件信息,如果是目录则列出文件列表
//ftpClient.list(path);
//列出指定目录内容
//ftpClient.nameList(path);
}
}