一开始写的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