package com.bettersoft.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.StringWriter;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
/**
* FTP上传文件,支持断点续传
* @author wanglh
*
*/
public class AppendFtp extends FTPClient {
/**
* 错误日志
* @param ae ae
*/
public void logException(Exception ae) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ae.printStackTrace(pw);
}
public boolean deleteFile(String pathname) {
boolean succ = false;
try {
succ = ftp.deleteFile(pathname);
} catch (IOException e) {
e.printStackTrace();
}
return succ;
}
public FTPFile[] listFiles(String remote) throws IOException {
if(remote != null && !"".equals(remote.trim())) {
ftp.changeWorkingDirectory(remote); // 进入ftp目录
}
return ftp.listFiles();
}
/**
* 上传文件
* @param remote,远程路径
* @param local 本地全路径
* @return 是否成功
* @throws IOException IOException
*/
public boolean upload(String remote, String local)
throws IOException {
String temp[] = local.replaceAll("\\\\","/").split("/");//取文件名
String fileName = "";
if(temp.length > 1){
fileName = temp[temp.length - 1];
}
ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 2进制文件时,防止文件损坏
boolean result;
if(remote != null && !"".equals(remote.trim())) {
ftp.changeWorkingDirectory(remote); // 进入ftp目录
}
boolean isExists = false;
long fileSize = 123;
FTPFile[] files = ftp.listFiles();
for (int i = 0; i < files.length; i++) {
FTPFile file = files[i];
if (fileName.equals(file.getName())) {
isExists = true;
fileSize = file.getSize();
break;
}
}
if (isExists) {
// 文件存在时, 使用断点上传方式
File fLocal = new File(local);
OutputStream os = ftp.appendFileStream(fileName);
RandomAccessFile randomAccessFileLocal = new RandomAccessFile(
fLocal, "r");
randomAccessFileLocal.seek(fileSize);
int len = 0;
byte[] bt = new byte[1024];
while ((len = randomAccessFileLocal.read(bt)) > 0) {
os.write(bt, 0, len);
}
randomAccessFileLocal.close();
os.close();
result = true;
ftp.completePendingCommand();
} else {
// 不存在时, 直接上传
File f = new File(local);
FileInputStream in = new FileInputStream(f);
result = ftp.storeFile(fileName, in);
in.close();
}
return result;
}
/**
* 建立FTP连接
* @param hostname FTP主机名
* @param port 端口
* @param username 用户名
* @param password 密码
* @return 是否连接成功
* @throws IOException IOException
*/
public boolean connect(String hostname, int port, String username,
String password) throws IOException {
ftp = new FTPClient();
ftp.connect(hostname, port);
ftp.login(username, password);
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
disconnect();
return false;
}
return true;
}
/**
* 关闭FTP连接
*/
public void disconnect() throws IOException {
if (ftp.isConnected()) {
ftp.disconnect();
}
}
public FTPClient ftp;
public static void main(String[] args) {
try {
AppendFtp ftpClient = new AppendFtp();
ftpClient.connect("127.0.0.1", 21, "refar", "refar123");
ftpClient.deleteFile("/sss/abc.txt");
ftpClient.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
网上拷贝的代码,但网上的断点续传有问题,没有
ftp.completePendingCommand();
分享到:
相关推荐
在这个资料包中,你将找到使用Apache Commons Net进行FTP断点续传的相关资料和实例,以及可能包含MyEclipse 9.0的开发环境配置和FileZilla服务器的设置指南。 Apache Commons Net库提供了FTPClient类,它是Java实现...
1. **连接服务器**:首先,需要使用Java的`java.net.Socket`类或者FTP库如Apache Commons Net建立与FTP服务器的连接,并登录到指定的账号。 2. **被动模式设置**:FTP有两种工作模式,主动和被动。在Java中,通常...
总之,Java实现FTP断点续传涉及到网络编程和文件操作,需要理解FTP协议以及如何使用如Apache Commons Net这样的库。通过实践和学习提供的源码,开发者可以更好地掌握这项技术,从而提高文件传输的效率和可靠性。
import org.apache.commons.net.ftp.FTPClient; public class FtpClientExample { public static void main(String[] args) { FTPClient client = new FTPClient(); try { // 连接到FTP服务器 client.connect...
在Android平台上实现FTP断点续传下载功能,可以极大地提高用户下载大文件的效率和体验。断点续传允许应用程序在文件下载中断后从上次停止的地方继续,而不是重新开始整个下载过程。以下是对这一主题的详细阐述: 1....
1. **FTPClient库**:Java中通常使用Apache Commons Net库中的`FTPClient`类来处理FTP连接和操作。这个库提供了丰富的API,可以用来执行各种FTP命令,包括登录、上传、下载、断点续传等。 2. **被动模式(Passive ...
在Java中,我们可以使用`java.net`包中的`Socket`类来实现基本的FTP功能,但更常见的是使用Apache Commons Net库,它提供了更丰富的FTP功能,包括多线程和断点续传。 FTP服务器是运行FTP服务的计算机,它存储着可供...
在Java中,可以使用`java.net.Socket`和`java.io`类实现FTP功能,但更常见的是使用Apache的Commons Net库,它提供了一个方便的FTPClient类。实现断点续传的关键在于使用`FTPClient.setRestartOffset()`方法设置起始...
- **Apache Commons Net库**:Android应用通常使用Apache Commons Net库来实现FTP客户端功能,它提供了FTPClient类,可以方便地执行登录、上传、下载、断点续传等操作。 - **FTP传输模式**:主动模式和被动模式的...
Java FTP(File Transfer Protocol)是Java编程中用于与FTP服务器交互的一种技术,它允许程序员编写应用程序来上传、下载文件,并实现断点续传功能。在本文中,我们将深入探讨Java FTP上传、下载以及断点续传的核心...
以上就是使用Java和Apache Commons Net库实现FTP断点续传的基本步骤。在实际应用中,你可能还需要处理异常,优化文件读写性能,以及考虑其他因素,如重试机制、错误处理等。了解这些知识点将使你能够高效地实现在...
Java 实现 FTP 断点续传是一项常见的...总的来说,实现Java中的FTP断点续传涉及理解FTP协议,使用适当的库,以及处理可能出现的网络和文件系统问题。在开发过程中,注意错误处理和性能优化,确保功能的稳定性和效率。
Java FTP 断点续传是网络编程中一个重要的技术,主要应用于大文件传输,它可以提高文件上传或下载的效率,并且在传输中断后能够继续从...通过对这些内容的深入理解和实践,你将能更熟练地使用Java进行FTP断点续传编程。
Java FTP多线程批量断点续传是一种在Java编程中实现高效、稳定文件传输的方法,尤其适用于大文件的上传和下载。在这个过程中,我们利用FTP(File Transfer Protocol)协议,结合多线程技术和断点续传功能,可以显著...
1. **FTP协议支持**:Apache Commons Net提供了全面的FTP客户端实现,涵盖了FTP协议的各种功能,如连接、登录、目录浏览、文件传输(PUT和GET)、断点续传、被动模式等。这使得开发人员无需深入了解FTP协议的细节,...
以下是实现FTP断点续传的一个简要步骤: 1. 创建`FTPClient`实例并连接到FTP服务器。 2. 使用`FTPClient.login()`登录FTP服务器,提供用户名和密码。 3. 设置FTP工作模式,通常是被动模式,`FTPClient....
Ftp4j提供了一个完整的FTP客户端实现,包括基本的文件操作和更高级的功能,如断点续传、多线程下载、文件列表解析等。其API简洁且灵活,允许开发者根据需求自定义各种行为。Ftp4j还支持FTPS(FTP over TLS/SSL)和...
### Java实现FTP多线程断点续传:深入解析与技术要点 在现代软件开发中,数据传输是一项基本且关键的任务,特别是在处理...通过理解并应用上述关键技术点,开发者可以在自己的项目中实现高效、稳定的FTP断点续传功能。