ftp复制文件 java_java使用Apache工具集实现ftp文件传输代码详解

本文主要介绍如何使用Apache工具集commons-net提供的ftp工具实现向ftp服务器上传和下载文件。

一、准备

需要引用commons-net-3.5.jar包。

使用maven导入:

commons-net

commons-net

3.5

手动下载:

二、连接FTP Server

/**

* 连接FTP Server

* @throws IOException

*/

public static final String ANONYMOUS_USER="anonymous";

private FTPClient connect(){

FTPClient client = new FTPClient();

try{

//连接FTP Server

client.connect(this.host, this.port);

//登陆

if(this.user==null||"".equals(this.user)){

//使用匿名登陆

client.login(ANONYMOUS_USER, ANONYMOUS_USER);

} else{

client.login(this.user, this.password);

}

//设置文件格式

client.setFileType(FTPClient.BINARY_FILE_TYPE);

//获取FTP Server 应答

int reply = client.getReplyCode();

if(!FTPReply.isPositiveCompletion(reply)){

client.disconnect();

return null;

}

//切换工作目录

changeWorkingDirectory(client);

System.out.println("===连接到FTP:"+host+":"+port);

}

catch(IOException e){

return null;

}

return client;

}

/**

* 切换工作目录,远程目录不存在时,创建目录

* @param client

* @throws IOException

*/

private void changeWorkingDirectory(FTPClient client) throws IOException{

if(this.ftpPath!=null&&!"".equals(this.ftpPath)){

Boolean ok = client.changeWorkingDirectory(this.ftpPath);

if(!ok){

//ftpPath 不存在,手动创建目录

StringTokenizer token = new StringTokenizer(this.ftpPath,"\\//");

while(token.hasMoreTokens()){

String path = token.nextToken();

client.makeDirectory(path);

client.changeWorkingDirectory(path);

}

}

}

}

/**

* 断开FTP连接

* @param ftpClient

* @throws IOException

*/

public void close(FTPClient ftpClient) throws IOException{

if(ftpClient!=null && ftpClient.isConnected()){

ftpClient.logout();

ftpClient.disconnect();

}

System.out.println("!!!断开FTP连接:"+host+":"+port);

}

host:ftp服务器ip地址

port:ftp服务器端口

user:登陆用户

password:登陆密码

登陆用户为空时,使用匿名用户登陆。

ftpPath:ftp路径,ftp路径不存在时自动创建,如果是多层目录结构,需要迭代创建目录。

三、上传文件

/**

* 上传文件

* @param targetName 上传到ftp文件名

* @param localFile 本地文件路径

* @return

*/

public Boolean upload(String targetName,String localFile){

//连接ftp server

FTPClient ftpClient = connect();

if(ftpClient==null){

System.out.println("连接FTP服务器["+host+":"+port+"]失败!");

return false;

}

File file = new File(localFile);

//设置上传后文件名

if(targetName==null||"".equals(targetName))

targetName = file.getName();

FileInputStream fis = null;

try{

long now = System.currentTimeMillis();

//开始上传文件

fis = new FileInputStream(file);

System.out.println(">>>开始上传文件:"+file.getName());

Boolean ok = ftpClient.storeFile(targetName, fis);

if(ok){

//上传成功

long times = System.currentTimeMillis() - now;

System.out.println(String.format(">>>上传成功:大小:%s,上传时间:%d秒", formatSize(file.length()),times/1000));

} else//上传失败

System.out.println(String.format(">>>上传失败:大小:%s", formatSize(file.length())));

}

catch(IOException e){

System.err.println(String.format(">>>上传失败:大小:%s", formatSize(file.length())));

e.printStackTrace();

return false;

}

finally{

try{

if(fis!=null)

fis.close();

close(ftpClient);

}

catch(Exception e){

}

}

return true;

}

四、下载文件

/**

* 下载文件

* @param localPath 本地存放路径

* @return

*/

public int download(String localPath){

// 连接ftp server

FTPClient ftpClient = connect();

if(ftpClient==null){

System.out.println("连接FTP服务器["+host+":"+port+"]失败!");

return 0;

}

File dir = new File(localPath);

if(!dir.exists())

dir.mkdirs();

FTPFile[] ftpFiles = null;

try{

ftpFiles = ftpClient.listFiles();

if(ftpFiles==null||ftpFiles.length==0)

return 0;

}

catch(IOException e){

return 0;

}

int c = 0;

for (int i=0;i

FileOutputStream fos = null;

try{

String name = ftpFiles[i].getName();

fos = new FileOutputStream(new File(dir.getAbsolutePath()+File.separator+name));

System.out.println("<<

long now = System.currentTimeMillis();

Boolean ok = ftpClient.retrieveFile(new String(name.getBytes("UTF-8"),"ISO-8859-1"), fos);

if(ok){

//下载成功

long times = System.currentTimeMillis() - now;

System.out.println(String.format("<<

c++;

} else{

System.out.println("<<

}

}

catch(IOException e){

System.err.println("<<

e.printStackTrace();

}

finally{

try{

if(fos!=null)

fos.close();

close(ftpClient);

}

catch(Exception e){

}

}

}

return c;

}

格式化文件大小

private static final DecimalFormat DF = new DecimalFormat("#.##");

/**

* 格式化文件大小(B,KB,MB,GB)

* @param size

* @return

*/

private String formatSize(long size){

if(size<1024){

return size + " B";

}else if(size<1024*1024){

return size/1024 + " KB";

}else if(size<1024*1024*1024){

return (size/(1024*1024)) + " MB";

}else{

double gb = size/(1024*1024*1024);

return DF.format(gb)+" GB";

}

}

五、测试

public static void main(String args[]){

FTPTest ftp = new FTPTest("192.168.1.10",21,null,null,"/temp/2016/12");

ftp.upload("newFile.rar", "D:/ftp/TeamViewerPortable.rar");

System.out.println("");

ftp.download("D:/ftp/");

}

结果

===连接到FTP:192.168.1.10:21

>>>开始上传文件:TeamViewerPortable.rar

>>>上传成功:大小:5 MB,上传时间:3秒

!!!断开FTP连接:192.168.1.10:21

===连接到FTP:192.168.1.10:21

<<

<<

!!!断开FTP连接:192.168.1.10:21

总结

以上就是本文关于java使用Apache工具集实现ftp文件传输代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值