不幸的是getExitStatus()
方法总是返回-1,所以我不能用它来告诉我文件上传是否有效。我尝试使用getInputStream()
类的Channel
方法,但每当我尝试从输入流中读取时,我的代码永远被阻塞,好像Channel
实例仍处于打开/连接状态(即使isConnected
和isClosed()
分别是假的和真实的 - 表明频道确实已经关闭了)。我尝试从输入流中读取一个数据字节后,以下代码总是阻塞:
public class Put {
public static void main(String[] args) throws IOException {
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
InputStream in = null;
JSch jsch = new JSch();
try {
jsch.setKnownHosts("known_hosts");
session = jsch.getSession("user", "host", 22);
session.setPassword("password");
session.connect();
channel = session.openChannel("sftp");
channel.setInputStream(null);
stdout = channel.getInputStream();
channel.connect();
channelSftp = (ChannelSftp)channel;
channelSftp.cd("/path/to/sftp");
channelSftp.put("/path/to/localfile", "/path/to/remotefile");
} catch (JSchException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} catch (SftpException e) {
System.out.println(e.id);
System.out.println(e.getMessage());
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(channelSftp != null && channelSftp.isConnected())channelSftp.exit();
if(channel != null && channel.isConnected()) channel.disconnect();
if(session != null && session.isConnected()) session.disconnect();
}
System.out.println("Channel is connected? " + channel.isConnected()); // returns false as i would expect
System.out.println("Channel is closed? " + channel.isClosed()); // returns true as i would expect
System.out.println(stdout.available()); // returns 0
System.out.println(stdout.read()); // code blocks here
}
}
我想我的问题是:
每当我尝试从输入流中读取时,为什么我的代码会阻塞(即使Channel
确实已关闭)
判断文件上传是否有效的方法是什么。我想如果抛出SFTPException不成功,否则我可以认为它是成功的?
答案 0 :(得分:5)
我想如果抛出SFTPException不成功,否则我可以认为它是成功的?
这是正确的。如果由于任何原因失败,各种ChannelSftp.put()
函数将抛出异常。如果要仔细检查,可以在远程文件名上调用ChannelSftp.stat()
或...lstat()
进行检查。但请注意,在您有机会检查之前,另一个进程可能会假设删除或移动远程文件。
您通常不需要访问ChannelSftp
的输入或输出流。 getExitStatus()
将告诉您整个SFTP会话的退出状态,而不是特定操作的结果。
JCraft有an example program illustrating how to do SFTP你可能觉得有用。