前提1:在本机上安装了ftp服务器,且配置正确。用户名:ftp 密码:pass (也可以修改程序)
前提2:已经导入了commons-net-3.3-sources.jar
commons-net-3.3.jar
commons-net-examples-3.3.jar 三个jar包
前提3:确认通过客户端,能够正常进入ftp服务器
前提4:使用linux系统
package ftp;
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.OutputStream;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
/**
* 功能
* 1.将(指定文件)传输到ftp服务器的(指定文件夹下) 核心方法appenFile
* 2.下载(指定文件夹下的指定文件),到本地(指定位置) 核心方法retrieveFile
* 3.获取服务器上目录信息
* @author vking
*
*/
public class My_Ftp_Test
{
/**
* 获取到指定ftp服务器的链接
*
* @param hostname ip地址
* @param port 端口号
* @param username 用户名
* @param password 密码
* @return
* @throws SocketException
* @throws IOException
*/
public FTPClient getCon(String ip, int port, String username,
String password) throws SocketException, IOException
{
FTPClient ftp = new FTPClient();// 获取到服务器代理对象
// 输入ip和端口
ftp.connect(ip, port);
// 输入登录名和密码
ftp.login(username, password);
return ftp;
}
/**
* 总结:listFiles 和listNames效果相同, 当不写参数时,输出ftp文件夹下的文件;写上目录后,输出指定文件夹下的文件(都包含文件夹)
* 而listDirectories 输出指定目录下有多少个文件夹
* @param ftp
* @throws IOException
*/
// 遍历ftp上所有文件 传入一个path判断是文件么,是打印:不是,获取他的文件集合,便利这个集合,再判断
private static void getFtpFiles(FTPClient ftp) throws IOException
{
FTPFile[] listFiles = ftp.listFiles();
System.out.println(listFiles.length);
for (int i = 0; i < listFiles.length; i++)
{
System.out.println("listFiles()"+listFiles[i]);
}
FTPFile[] listFiles2 = ftp.listFiles("ftp");
System.out.println(listFiles2.length);
for (int i = 0; i < listFiles2.length; i++)
{
System.out.println("listFiles2(ftp)"+listFiles2[i]);
}
FTPFile[] listFiles3 = ftp.listFiles("ftp/mmj");
System.out.println(listFiles3.length);
for (int i = 0; i < listFiles3.length; i++)
{
System.out.println("listFiles3(ftp/mmj)"+listFiles3[i]);
}
FTPFile[] listDirectories = ftp.listDirectories();
System.out.println( listDirectories.length);
for (int i = 0; i < listDirectories.length; i++)
{
System.out.println("listDirectories()"+listDirectories[i].getName());
}
FTPFile[] listDirectories2 =ftp.listDirectories("ftp");
System.out.println(listDirectories2.length);
for (int i = 0; i < listDirectories2.length; i++)
{
System.out.println("listDirectories2(ftp)"+listDirectories2[i]);
}
String[] listNames = ftp.listNames("ftp");
System.out.println( listNames.length);
for (int i = 0; i < listNames.length; i++)
{
System.out.println("listNames(ftp)::"+listNames[i]);
}
String[] listNames2 = ftp.listNames("ftp/mmj");
System.out.println( listNames2.length);
for (int i = 0; i < listNames2.length; i++)
{
System.out.println("listNames2(ftp/mmj)::"+listNames2[i]);
}
}
/**
* 向ftp服务器上传文件
*
* @param ftp
* @param pathname
* 文件名
* @param putPath
* 本地路径
* @throws FileNotFoundException
*/
public void putFile(FTPClient ftp, String pathname, String putPath)
throws FileNotFoundException
{
boolean blog = false;
File putFile = new File(putPath);
String putName = putFile.getName();// 上传文件名称
InputStream local = new FileInputStream(putFile);// 上传文件输入流
try
{
// 在服务器上创建文件夹,如果存在不创建
if (!ftp.changeWorkingDirectory(pathname))// 进入这个文件夹,如果失败,意味着不存在目录
{
ftp.makeDirectory(pathname); //创建目标文件夹
ftp.changeWorkingDirectory(pathname);
}
// 在该文件夹下传入文件,如果文件已经存在,不再传入
String[] listNames = ftp.listNames();
System.out.println(listNames.length);
for (int i = 0; i < listNames.length; i++)
{
System.out.println("listNames()::"+listNames[i]);
if (putName.equals(listNames[i]))
{
blog = true;
break;
}
}
if (!blog)// 不存在该文件,则上传
{
ftp.appendFile(putName, local);
System.out.println("文件上传成功!");
}
} catch (IOException e)
{
e.printStackTrace();
} finally
{
close(local, ftp, null);
}
}
/**
*
* 从ftp服务器下载文件
* @param pathname
* @param fileName
* @param localPath
* @param ftp ftp代理
* @param pathname FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
*/
public void downFile(FTPClient ftp, String pathname, String fileName,
String localPath)
{
OutputStream is = null;
try
{
ftp.changeWorkingDirectory(pathname);// 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs)
{
if (ff.getName().equals(fileName)) // 服务器是否存在该文件
{
File localFile = new File(localPath + "/" + ff.getName());
is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is); // 从服务器下载文件,指定文件名和输出流
}
}
} catch (Exception e)
{
e.printStackTrace();
} finally
{
close(null, ftp, is);
}
}
public static void main(String[] args) throws SocketException, IOException
{
String ip = "127.0.0.1";
int port = 21;
String username = "ftp";
String password = "pass";
String pathname = "ftp/mmj";// 上传到ftp的路径
String putPath = "test1.txt";
String downPath = "/home/vking/workspace/my_2D/mmj";
My_Ftp_Test myFtp = new My_Ftp_Test();
FTPClient con = myFtp.getCon(ip, port, username, password);
// 测试:FTPfile 是如何工作的
getFtpFiles(con);
myFtp.putFile(con, pathname, putPath);
con = myFtp.getCon(ip, port, username, password);
myFtp.downFile(con, pathname, putPath, downPath);// 这里不能直接用putPath,而应该用putName,但是由于是默认路径,所以可以这么写
}
// 关闭各种资源1.关闭文件输入流 2.关闭服务器连接3.关闭文件输出流
public void close(InputStream local, FTPClient ftp, OutputStream os)
{
try
{
if (local != null)
{
local.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
try
{
if (ftp != null)
{
if (ftp.isConnected())
{
ftp.disconnect();
}
}
} catch (IOException e)
{
e.printStackTrace();
}
try
{
if (os != null)
{
os.close();
}
} catch (Exception e)
{
e.printStackTrace();
}
}
}