apache ftp 上传文件的时候,拔断网线,重新插入网线,删除传输异常的文件,提示文件被占用。只能重启FTP服务才能正常删除

lizhey314 2017-10-30 02:45:30
apache ftp 上传文件的时候,拔断网线,重新插入网线,删除传输异常的文件,提示文件被占用。只能重启FTP服务才能正常删除。

是ftp断网的时候我哪里没有释放流吗?在线求各位大佬解答!

代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

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;

import com.synball.turbodx.component.file.remote.FtpListener;

public class ContinueFTP {
private 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);
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){
if(ftpClient.login(username, password)){
return true;
}
}
disconnect();
return false;
}

/**
* 从FTP服务器上下载文件
* @param remote 远程文件路径
* @param local 本地文件路径
* @return 是否成功
* @throws IOException
*/
public boolean download(String remote,String local) throws IOException{
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
boolean result;
File f = new File(local);
FTPFile[] files = ftpClient.listFiles(remote);
if(files.length != 1){
System.out.println("远程文件不唯一");
return false;
}
long lRemoteSize = files[0].getSize();
if(f.exists()){
OutputStream out = new FileOutputStream(f,true);
System.out.println("本地文件大小为:"+f.length());
if(f.length() >= lRemoteSize){
System.out.println("本地文件大小大于远程文件大小,下载中止");
return false;
}
ftpClient.setRestartOffset(f.length());
result = ftpClient.retrieveFile(remote, out);
out.close();
}else {
OutputStream out = new FileOutputStream(f);
result = ftpClient.retrieveFile(remote, out);
out.close();
}
return result;
}

/**
* 上传文件到FTP服务器,支持断点续传
* @param local 本地文件名称,绝对路径
* @param remote 远程文件路径,使用/home/directory1/subdirectory/file.ext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构
* @return 上传结果
* @throws IOException
*/
public String upload(String local,String remote) throws IOException{
//设置PassiveMode传输
ftpClient.enterLocalPassiveMode();
//设置以二进制流的方式传输
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//对远程目录的处理
String remoteFileName = remote;
String result;
if(remote.contains("/")){
remoteFileName = remote.substring(remote.lastIndexOf("/")+1);
String directory = remote.substring(0,remote.lastIndexOf("/")+1);
if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){
//如果远程目录不存在,则递归创建远程服务器目录
int start=0;
int end = 0;
if(directory.startsWith("/")){
start = 1;
}else{
start = 0;
}
end = directory.indexOf("/",start);
while(true){
String subDirectory = remote.substring(start,end);
if(!ftpClient.changeWorkingDirectory(subDirectory)){
if(ftpClient.makeDirectory(subDirectory)){
ftpClient.changeWorkingDirectory(subDirectory);
}else {
System.out.println("创建目录失败");
return "";
}
}

start = end + 1;
end = directory.indexOf("/",start);

//检查所有目录是否创建完毕
if(end <= start){
break;
}
}
}
}
//监听
// FtpListener listener = new FtpListener(null,0,remoteFileName);
// ftpClient.setCopyStreamListener(listener.createListener());
//检查远程是否存在文件
FTPFile[] files = ftpClient.listFiles(remoteFileName);
if(files.length == 1){
long remoteSize = files[0].getSize();
File f = new File(local);
long localSize = f.length();
if(remoteSize==localSize){
return "File_Exits";
}else if(remoteSize > localSize){
return "Remote_Bigger_Local";
}

//尝试移动文件内读取指针,实现断点续传
InputStream is = new FileInputStream(f);
if(is.skip(remoteSize)==remoteSize){
ftpClient.setRestartOffset(remoteSize);
if(ftpClient.storeFile(remote, is)){
return "Upload_From_Break_Success";
}
}

//如果断点续传没有成功,则删除服务器上文件,重新上传
if(!ftpClient.deleteFile(remoteFileName)){
return "Delete_Remote_Faild";
}
is = new FileInputStream(f);
if(ftpClient.storeFile(remote, is)){
result = "Upload_New_File_Success";
}else{
result = "Upload_New_File_Failed";
}
is.close();
}else {
InputStream is = new FileInputStream(local);
if(ftpClient.storeFile(remoteFileName, is)){
result = "Upload_New_File_Success";
}else{
result = "Upload_New_File_Failed";
}
is.close();
}
return result;
}
/**
* 断开与远程服务器的连接
* @throws IOException
*/
public void disconnect() throws IOException{
if(ftpClient.isConnected()){
ftpClient.disconnect();
}
}

public static void main(String[] args) {
ContinueFTP myFtp = new ContinueFTP();
try {
myFtp.connect("192.168.1.15", 21, "hadoop", "hadoop");
System.out.println(myFtp.upload("E:\\files\\csv\\31.zip", "/server/31.zip"));
myFtp.disconnect();
} catch (IOException e) {
System.out.println("连接FTP出错:"+e.getMessage());
}
}
}
...全文
327 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizhey314 2017-10-30
  • 打赏
  • 举报
回复
大侠们,给点指导性的意见。在线求

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧