- 浏览: 697825 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yzs5273:
没什么用。都试过了
WIN7下CS不能全屏的解决方法 -
di1984HIT:
不错,学习了
读取本地计算机中的安装程序列表 -
ffedu:
[flash=200,200][url][img][list] ...
linux/unix中如何用find命令详解,非常详细的介绍,比man find强100倍(转) -
lintghi:
...
Log4j使用相对路径指定log文件及使用总结 -
nick.s.ni:
唉,Java中引用的包没有介绍啊,如果数据库用UTF-8的格式 ...
Oracle 中Java 对象与PL/SQL类型的映射及使用(转)
利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类。主要实现一下功能
1.支持上传下载。支持断点续传
2.支持进度汇报
3.支持对于中文目录及中文文件创建的支持。
具体请看代码,上面有详细的注释。简化版本请参见http://zhouzaibao.iteye.com/blog/342766
枚举类UploadStatus代码
public enum UploadStatus { Create_Directory_Fail, //远程服务器相应目录创建失败 Create_Directory_Success, //远程服务器闯将目录成功 Upload_New_File_Success, //上传新文件成功 Upload_New_File_Failed, //上传新文件失败 File_Exits, //文件已经存在 Remote_Bigger_Local, //远程文件大于本地文件 Upload_From_Break_Success, //断点续传成功 Upload_From_Break_Failed, //断点续传失败 Delete_Remote_Faild; //删除远程文件失败 }
枚举类DownloadStatus代码
public enum DownloadStatus { Remote_File_Noexist, //远程文件不存在 Local_Bigger_Remote, //本地文件大于远程文件 Download_From_Break_Success, //断点下载文件成功 Download_From_Break_Failed, //断点下载文件失败 Download_New_Success, //全新下载文件成功 Download_New_Failed; //全新下载文件失败 }
核心FTP代码
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.RandomAccessFile; import open.mis.data.DownloadStatus; import open.mis.data.UploadStatus; import org.apache.commons.net.PrintCommandListener; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; /** * 支持断点续传的FTP实用类 * @author BenZhou * @version 实现基本断点上传下载 * @version 实现上传下载进度汇报 * @version 实现中文目录创建及中文文件创建,添加对于中文的支持 */ public class ContinueFTP { public FTPClient ftpClient = new FTPClient(); public ContinueFTP(){ //设置将过程中使用到的命令输出到控制台 this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); } /** * 连接到FTP服务器 * @param hostname 主机名 * @param port 端口 * @param username 用户名 * @param password 密码 * @return 是否连接成功 * @throws IOException */ public boolean connect(String hostname,int port,String username,String password) throws IOException{ ftpClient.connect(hostname, port); ftpClient.setControlEncoding("GBK"); if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){ if(ftpClient.login(username, password)){ return true; } } disconnect(); return false; } /** * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 * @param remote 远程文件路径 * @param local 本地文件路径 * @return 上传的状态 * @throws IOException */ public DownloadStatus download(String remote,String local) throws IOException{ //设置被动模式 ftpClient.enterLocalPassiveMode(); //设置以二进制方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); DownloadStatus result; //检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"),"iso--)); if(files.length != { System.out.println("远程文件不存在"); return DownloadStatus.Remote_File_Noexist; } long lRemoteSize = files[.getSize(); File f = new File(local); //本地存在文件,进行断点下载 if(f.exists()){ long localSize = f.length(); //判断本地文件大小是否大于远程文件大小 if(localSize >= lRemoteSize){ System.out.println("本地文件大于远程文件,下载中止"); return DownloadStatus.Local_Bigger_Remote; } //进行断点续传,并记录状态 FileOutputStream out = new FileOutputStream(f,true); ftpClient.setRestartOffset(localSize); InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso--)); byte[] bytes = new byte[]; long step = lRemoteSize / long process=localSize /step; int c; while((c = in.read(bytes))!= -{ out.write(bytes,c); localSize+=c; long nowProcess = localSize /step; if(nowProcess > process){ process = nowProcess; if(process % == System.out.println("下载进度:"+process); //TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); boolean isDo = ftpClient.completePendingCommand(); if(isDo){ result = DownloadStatus.Download_From_Break_Success; }else { result = DownloadStatus.Download_From_Break_Failed; } }else { OutputStream out = new FileOutputStream(f); InputStream in= ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso--)); byte[] bytes = new byte[]; long step = lRemoteSize / long process= long localSize = ; int c; while((c = in.read(bytes))!= -{ out.write(bytes, c); localSize+=c; long nowProcess = localSize /step; if(nowProcess > process){ process = nowProcess; if(process % == System.out.println("下载进度:"+process); //TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); boolean upNewStatus = ftpClient.completePendingCommand(); if(upNewStatus){ result = DownloadStatus.Download_New_Success; }else { result = DownloadStatus.Download_New_Failed; } } return result; } /** * 上传文件到FTP服务器,支持断点续传 * @param local 本地文件名称,绝对路径 * @param remote 远程文件路径,使用/home/directorysubdirectory/file.ext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 * @return 上传结果 * @throws IOException */ public UploadStatus upload(String local,String remote) throws IOException{ //设置PassiveMode传输 ftpClient.enterLocalPassiveMode(); //设置以二进制流的方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setControlEncoding("GBK"); UploadStatus result; //对远程目录的处理 String remoteFileName = remote; if(remote.contains("/")){ remoteFileName = remote.substring(remote.lastIndexOf("/")+; //创建服务器远程目录结构,创建失败直接返回 if(CreateDirecroty(remote, ftpClient)==UploadStatus.Create_Directory_Fail){ return UploadStatus.Create_Directory_Fail; } } //检查远程是否存在文件 FTPFile[] files = ftpClient.listFiles(new String(remoteFileName.getBytes("GBK"),"iso--)); if(files.length == { long remoteSize = files[.getSize(); File f = new File(local); long localSize = f.length(); if(remoteSize==localSize){ return UploadStatus.File_Exits; }else if(remoteSize > localSize){ return UploadStatus.Remote_Bigger_Local; } //尝试移动文件内读取指针,实现断点续传 result = uploadFile(remoteFileName, f, ftpClient, remoteSize); //如果断点续传没有成功,则删除服务器上文件,重新上传 if(result == UploadStatus.Upload_From_Break_Failed){ if(!ftpClient.deleteFile(remoteFileName)){ return UploadStatus.Delete_Remote_Faild; } result = uploadFile(remoteFileName, f, ftpClient, ; } }else { result = uploadFile(remoteFileName, new File(local), ftpClient, ; } return result; } /** * 断开与远程服务器的连接 * @throws IOException */ public void disconnect() throws IOException{ if(ftpClient.isConnected()){ ftpClient.disconnect(); } } /** * 递归创建远程服务器目录 * @param remote 远程服务器文件绝对路径 * @param ftpClient FTPClient对象 * @return 目录创建是否成功 * @throws IOException */ public UploadStatus CreateDirecroty(String remote,FTPClient ftpClient) throws IOException{ UploadStatus status = UploadStatus.Create_Directory_Success; String directory = remote.substring(remote.lastIndexOf("/")+; if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(new String(directory.getBytes("GBK"),"iso--))){ //如果远程目录不存在,则递归创建远程服务器目录 int start= int end = if(directory.startsWith("/")){ start = }else{ start = } end = directory.indexOf("/",start); while(true){ String subDirectory = new String(remote.substring(start,end).getBytes("GBK"),"iso--); if(!ftpClient.changeWorkingDirectory(subDirectory)){ if(ftpClient.makeDirectory(subDirectory)){ ftpClient.changeWorkingDirectory(subDirectory); }else { System.out.println("创建目录失败"); return UploadStatus.Create_Directory_Fail; } } start = end + end = directory.indexOf("/",start); //检查所有目录是否创建完毕 if(end <= start){ break; } } } return status; } /** * 上传文件到服务器,新上传和断点续传 * @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变 * @param localFile 本地文件File句柄,绝对路径 * @param processStep 需要显示的处理进度步进值 * @param ftpClient FTPClient引用 * @return * @throws IOException */ public UploadStatus uploadFile(String remoteFile,File localFile,FTPClient ftpClient,long remoteSize) throws IOException{ UploadStatus status; //显示进度的上传 long step = localFile.length() / long process = long localreadbytes = ; RandomAccessFile raf = new RandomAccessFile(localFile,"r"); OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("GBK"),"iso--)); //断点续传 if(remoteSize>{ ftpClient.setRestartOffset(remoteSize); process = remoteSize /step; raf.seek(remoteSize); localreadbytes = remoteSize; } byte[] bytes = new byte[]; int c; while((c = raf.read(bytes))!= -{ out.write(bytes,c); localreadbytes+=c; if(localreadbytes / step != process){ process = localreadbytes / step; System.out.println("上传进度:" + process); //TODO 汇报上传状态 } } out.flush(); raf.close(); out.close(); boolean result =ftpClient.completePendingCommand(); if(remoteSize > { status = result?UploadStatus.Upload_From_Break_Success:UploadStatus.Upload_From_Break_Failed; }else { status = result?UploadStatus.Upload_New_File_Success:UploadStatus.Upload_New_File_Failed; } return status; } public static void main(String[] args) { ContinueFTP myFtp = new ContinueFTP(); try { myFtp.connect("., , "nid", "); // myFtp.ftpClient.makeDirectory(new String("电视剧".getBytes("GBK"),"iso--)); // myFtp.ftpClient.changeWorkingDirectory(new String("电视剧".getBytes("GBK"),"iso--)); // myFtp.ftpClient.makeDirectory(new String("走西口".getBytes("GBK"),"iso--)); // System.out.println(myFtp.upload("E:\\yw.flv", "/yw.flv",); // System.out.println(myFtp.upload("E:\\走西口.mp,"/央视走西口/新浪网/走西口.mp)); System.out.println(myFtp.download("/央视走西口/新浪网/走西口.mp, "E:\\走西口mp)); myFtp.disconnect(); } catch (IOException e) { System.out.println("连接FTP出错:"+e.getMessage()); } } }
发表评论
-
Transfer
2017-06-29 23:03 0Find connections count: ... -
Discover the Mystery of Metaspace
2017-06-23 16:47 0The JDK 8 HotSpot JVM is now u ... -
Command Line JMX Client
2014-12-29 13:12 2595Command Line Parser: GNUComman ... -
Something about JVM class loading and initialization
2014-05-09 10:04 1032Class loading stages: Loadin ... -
When a class is loaded and initialized in JVM - Java
2014-05-08 19:09 988from: http://javarevisited.blo ... -
【深入Java虚拟机】之四:类加载机制
2014-05-08 15:12 899转载请注明出处:http://blog.csdn.net/n ... -
Java Reflection - Dynamic Class Loading and Reloading
2014-05-08 12:04 942From: http://tutorials.jenkov. ... -
Java 类加载与初始化
2014-02-19 19:12 810转载自:http://www.cnblogs.c ... -
javax.management.StandardMBean: When and Why. (Reposted)
2013-12-26 15:34 1084Q: When is a Standard MBean no ... -
JVM调优的"标准参数"的各种陷阱(转)
2013-11-11 19:55 2051From: http://hllvm.group.itey ... -
Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
2013-11-11 11:05 1019(From: http://www.oracle.com/ ... -
An article about TLAB
2013-11-11 10:57 756(From: https://blogs.oracle.co ... -
【JVM】HotSpot JVM内存管理和GC策略总结(转)
2013-11-07 23:39 592JVM的相关知识是学习java高级特性必须要去深入学习的。平 ... -
jstat分析VM内存
2013-11-07 16:41 904Jstat 是JDK自带的一个轻量级小工具。全称“Java ... -
java的GridBagLayout网格包布局管理器使用详解 (转)
2013-11-01 16:44 0网格包布局管理是最复 ... -
java动态跟踪分析工具BTrace实现原理
2013-09-01 12:34 1267转自:http://kenwublog.com ... -
Java synchronize用法(转)
2012-11-05 00:20 1207在多个并发线程之间共用资源,就需要进行同步处理。Java虚拟机 ... -
Interview material collection
2012-07-09 23:05 11901. Why can't static methods be ... -
不要重复 DAO!(转)
2011-12-29 22:17 1242使用 Hibernate 和 Spri ... -
JVM 诊断工具(转)
2011-11-25 12:00 17611.jinfo 描述:输出给定 java 进程所有的配置信 ...
相关推荐
下面是一个简单的示例代码片段,展示如何使用Java实现FTP断点续传的基本流程: ```java import org.apache.commons.net.ftp.FTPClient; public class FtpClientExample { public static void main(String[] args)...
在Android开发中,FTP协议可以用于实现文件的下载和上传功能,尤其是在需要断点续传的情况下,能够提高用户下载大文件的体验。下面我们将深入探讨如何在Android环境中实现FTP的多线程断点续传下载和上传。 **FTP...
1. **Java FTPClient库**: 如Apache Commons Net中的`FTPClient`类,提供了丰富的API来实现FTP客户端功能,如连接服务器、登录、上传/下载文件、断点续传等。 2. **连接管理**: 客户端需要正确管理FTP连接,包括...
在实际应用中,`FTPClient.java`和`FtpSession.java`可以作为一个基础框架,开发者可以根据项目需求对其进行扩展和定制,例如添加日志记录、支持断点续传、文件列表的获取等特性。 最后,压缩包中的...
4. **使用edtFTPj/Pro**:`edtFTPj/Pro`是一个强大的Java FTP库,提供了更高级的功能,如SSL/TLS支持,断点续传,文件同步等。它的API使用方式与Apache Commons Net类似,但可能具有更丰富的错误处理和更友好的接口...
FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在客户端和服务器之间传输文件。在这个“clientFtp.rar”压缩包中,我们找到了一个名为“clientFtp”的项目,它是一个用Java实现的FTP客户端。这个...
使用Apache FTPClient,你可以执行基本的FTP操作,如登录服务器、改变工作目录、上传和下载文件、断点续传等。以下是一个简单的示例: ```java import org.apache.commons.net.ftp.*; FTPClient client = new ...
不同的FTP客户端库提供的文件传输功能不同,例如一些库提供了断点续传、文件断点续传等功能。 3. 安全性功能 安全性功能是FTP客户端库的重要方面之一,FTP客户端库需要提供基于SSL/TLS的加密传输功能,以确保数据...
Ftp4j提供了一个完整的FTP客户端实现,包括基本的文件操作和更高级的功能,如断点续传、多线程下载、文件列表解析等。其API简洁且灵活,允许开发者根据需求自定义各种行为。Ftp4j还支持FTPS(FTP over TLS/SSL)和...
2. **FTP协议**:尤其适用于大文件和批量文件的传输,传输速度更快,且使用Java开发FTP客户端更加便捷。 综合考虑,本文选择了FTP协议作为主要的传输方式,并使用Java语言编写客户端。 #### 三、Java FTP客户端库...
EDTFTPj是一个功能丰富的开源Java FTP/FTPS/SFTP客户端库,支持主动和被动模式、断点续传、多线程上传下载、文件重命名、文件权限设置等多种特性。其版本2.0.4提供了稳定性和性能的改进,以及对FTP和更安全的FTP ...
5. 断点续传:FTP客户端可以记住文件传输的位置,当网络中断后,可以从上次断开的地方继续传输,提高传输效率。 6. 保持连接:FTP客户端还可以支持保持连接,即在一段时间内不关闭与服务器的连接,允许连续多次操作...
使用 `FTPClient` 类,你可以执行更复杂的操作,包括断点续传和目录操作。以下是一个简单的下载文件示例: ```java import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import ...
对于大型应用,可能需要实现更复杂的FTP管理功能,如断点续传、多线程下载等。Apache Commons Net库提供了丰富的API来支持这些需求,使得在Java中处理FTP任务变得相对简单。 总之,Java结合Apache Commons Net库为...
9. **错误处理和断点续传**:一个完善的FTP客户端通常会处理网络中断、文件传输错误等情况,并可能支持断点续传,即在传输中断后能从上次中断的位置继续。 10. **权限管理**:在Android系统中,使用FTP进行文件传输...
- 支持断点续传,允许在上传中断后从上次断点继续。 - 支持文件重命名、目录操作和权限设置。 五、实战应用 在实际开发中,我们可以利用Apache Commons Net库轻松地构建FTP文件上传功能。以下是一个简单的示例: ...
在IT行业中,Java是一种广泛应用的编程语言,尤其在文件传输领域。本文将深入探讨如何使用Java实现SFTP(Secure File Transfer Protocol)和FTP...同时,根据具体需求,还可以扩展为支持批量上传下载、断点续传等功能。
特别是对于FTP,它不仅支持基本的文件上传和下载,还包含如文件重命名、目录管理、断点续传等功能。 二、FTPClient模块 在`commons-net-3.3.jar`中,FTPClient类是核心,它实现了完整的FTP协议。开发者可以通过创建...