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

 更新时间:2017年12月21日 14:31:40   作者:zlEven  
这篇文章主要介绍了java使用Apache工具集实现ftp文件传输代码详解,分享了详细连接ftp server和上传文件,下载文件的代码,以及结果展示,具有一定借鉴价值,需要的朋友可以参考下。

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

一、准备

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

使用maven导入:

<dependency>
  <groupId>commons-net</groupId>
  <artifactId>commons-net</artifactId>
  <version>3.5</version>
</dependency>

手动下载:

https://www.jb51.net/softs/550085.html

二、连接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<ftpFiles.length;i++){
		FileOutputStream fos = null;
		try{
			String name = ftpFiles[i].getName();
			fos = new FileOutputStream(new File(dir.getAbsolutePath()+File.separator+name));
			System.out.println("<<<开始下载文件:"+name);
			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("<<<下载成功:大小:%s,上传时间:%d秒", formatSize(ftpFiles[i].getSize()),times/1000));
				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
<<<开始下载文件:newFile.rar
<<<下载成功:大小:5 MB,上传时间:4秒
!!!断开FTP连接:192.168.1.10:21

总结

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

相关文章

  • Java中int[]与ArrayList<>数组转换方法详解

    Java中int[]与ArrayList<>数组转换方法详解

    这篇文章主要介绍了在Java中将int[]和ArrayList进行双向转换的方法,包括手动遍历和使用Java8 Stream API两种方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • Jmeter的接口测试详细步骤并实现业务闭环

    Jmeter的接口测试详细步骤并实现业务闭环

    这篇文章主要介绍了Jmeter的接口测试详细步骤并实现业务闭环,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Java模拟多线程实现抢票代码实例

    Java模拟多线程实现抢票代码实例

    这篇文章主要介绍了Java模拟多线程实现抢票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • WebUploader实现图片上传功能

    WebUploader实现图片上传功能

    这篇文章主要为大家详细介绍了WebUploader实现图片上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • java 实现web项目启动加载properties属性文件

    java 实现web项目启动加载properties属性文件

    这篇文章主要介绍了java 实现web项目启动加载properties属性文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java灵活使用枚举表示一组字符串的操作

    Java灵活使用枚举表示一组字符串的操作

    这篇文章主要介绍了Java灵活使用枚举表示一组字符串的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java中@JSONField注解用法、场景与实践详解

    Java中@JSONField注解用法、场景与实践详解

    这篇文章主要给大家介绍了关于Java中@JSONField注解用法、场景与实践的相关资料,并结合实际应用场景,帮助开发者在项目中更高效地处理JSON数据,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • MyBatis反向生成Example类的使用方式

    MyBatis反向生成Example类的使用方式

    今天小编就为大家分享一篇MyBatis反向生成Example类的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 详解Java并发包基石AQS

    详解Java并发包基石AQS

    Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock、Semaphore,它们的实现都用到了一个共同的基类--AbstractQueuedSynchronizer,简称AQS。本文将从几个方面来详细介绍:基本实现原理、自定义同步器、源码分析
    2021-06-06
  • Java内建函数与库的最佳实践方式

    Java内建函数与库的最佳实践方式

    Java提供了许多高效的内建函数和库,如Math、String、Arrays、Collections等类,以及java.util.concurrent、java.nio、java.util.stream、java.util.regex和java.time等包,通过利用这些工具和方法,可以显著提高Java代码的性能和效率
    2025-03-03

最新评论