Java连接FTP实现上传、下载文件并删除本地文件

一开始写的java连接FTP运行没有反应。
百度…需要一个jar包:commons-net-3.3.jar,导入jar包:

import org.apache.commons.net.ftp.FTPClient;

public class Test2 {
	public static void main(String[] args) {
		try {
			FTPClient ftp = new FTPClient();
			int reply;
			ftp.connect("xxx.xxx.x.xx", 22);//输入ip、端口,连接FTP服务器
			//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login("root", "root");//,用户名密码登录
			reply = ftp.getReplyCode();
			System.out.println(reply);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

出现新问题:

org.apache.commons.net.MalformedServerReplyException: Could not parse response code.
Server Reply: SSH-2.0-OpenSSH_7.4
	at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:337)
	at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
	at org.apache.commons.net.ftp.FTP._connectAction_(FTP.java:400)
	at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:924)
	at org.apache.commons.net.SocketClient.connect(SocketClient.java:183)
	at org.apache.commons.net.SocketClient.connect(SocketClient.java:203)
	at com.dfe.e8800.business.dtjc.temp.Test2.main(Test2.java:11)

找资料…
对于JAVA实现SFTP实例-SSH-2.0-OpenSSH_5.3等报错解决
https://blog.csdn.net/LNView/article/details/72412606

然后又需要新的jar包:jsch-0.1.55.jar ,导入新jar包。

具体代码链接中写的很详细了…连接FTP、上传文件、下载文件。

运行后发现有两个小问题:
1.服务一直开着没有关闭。
2.文件先下载再上传后,删除本地文件失败。

				//删除本地文件
        		File file = new File("D:\\oss\\"+fileName);
        		if(file.exists()) {
        			file.delete();
        			logger.info("本地文件删除");
        		}else {
        			logger.info("本地不存在");
        		}

发现本地文件删除失败…文件依然存在。

原因是InputStream正在使用file,IO流还没有关闭,如果要删除的文件正在被占用,文件会删不掉,例如别的程序还在对文件进行读取操作,没来得及释放文件,后边的程序就试图删除该文件,会导致删除失败。

所以对代码做了一些小小小小小改动:
新增了关闭服务的方法和对inputStream 、outputStream 的关闭

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.Vector;
 
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class FtpJSch {
	
	private static ChannelSftp sftp = null;	
	//账号
	private static String user = "root";
	//主机ip
	private static String host =  "xxx.xxx.x.xx";
	//密码
	private static String password = "root";
	//端口
	private static int port = 22;
	//上传地址
	private static String directory = "/users/ems/OSSDATA/testcopy";
	//下载地址
	private static String directoryy = "/users/ems/OSSDATA/test";
	//下载目录
	private static String saveFile = "D:\\oss\\";
	
	private static Session sshSession = null;
	
	//文件流
	InputStream inputStream = null;
	OutputStream outputStream = null;
	
	public static FtpJSch getConnect(){
		FtpJSch ftp = new FtpJSch();
		try {
			JSch jsch = new JSch();
			//获取sshSession  账号-ip-端口
			sshSession =jsch.getSession(user, host,port);
			//添加密码
			sshSession.setPassword(password);
			Properties sshConfig = new Properties();
			//严格主机密钥检查
			sshConfig.put("StrictHostKeyChecking", "no");			
			sshSession.setConfig(sshConfig);
			//开启sshSession链接
			sshSession.connect();
			//获取sftp通道
			Channel channel = sshSession.openChannel("sftp");
			//开启
			channel.connect();
			sftp = (ChannelSftp) channel;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ftp;
	}
	
	/**
	 * 
	 * @param uploadFile 上传文件的路径
	 * @return 服务器上文件名
	 */
	public String upload(String uploadFile) {
		File file = null;
		String fileName = null;
		try {
			sftp.cd(directory);
			file = new File(uploadFile);
			//获取随机文件名
			fileName  = file.getName();
			inputStream = new FileInputStream(file);
			sftp.put(inputStream, fileName);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return file == null ? null : fileName;
	}
	
	/**
	 * 下载文件
	 * 
	 * @param directory
	 *            下载目录
	 * @param downloadFile
	 *            下载的文件名
	 * @param saveFile
	 *            存在本地的路径
	 * @param sftp
	 */
	public void download(String downloadFileName) {
		try {
			sftp.cd(directoryy);
			
			String saveFileName = saveFile+downloadFileName;
			File file = new File(saveFileName);
			outputStream = new FileOutputStream(file);
			sftp.get(downloadFileName, outputStream);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 删除文件
	 * 
	 * @param deleteFile
	 *            要删除的文件名字
	 * @param sftp
	 */
	public void delete(String deleteFile) {
		try {
			sftp.cd(directory);
			sftp.rm(deleteFile);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 列出目录下的文件
	 * 
	 * @param directory
	 *            要列出的目录
	 * @param sftp
	 * @return
	 * @throws SftpException
	 */
	public Vector listFiles(String directoryy)
			throws SftpException {
		return sftp.ls(directoryy);
	}
	
	public void closeFtp() {
		try {
			if (inputStream != null) {
				inputStream.close();
			}
			if (outputStream != null) {
				outputStream.close();
			} 
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		sftp.disconnect();//断开信道
		sshSession.disconnect();//断开ssh连接释放内存资源
		System.out.println("关闭sftp");
	}
}

参考:
对于JAVA实现SFTP实例-SSH-2.0-OpenSSH_5.3等报错解决
https://blog.csdn.net/LNView/article/details/72412606
java的File类的 delete方法删不掉文件的原因分析
https://www.cnblogs.com/longshiyVip/p/4960306.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值