К сожалению, метод getExitStatus()
всегда возвращает -1, поэтому я не могу использовать это, чтобы сказать, работала ли загрузка файла. Я попытался использовать метод getInputStream()
класса Channel
но всякий раз, когда я пытался читать из isConnected
isClosed()
мой код блокировался навсегда, как если бы экземпляр 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 выбрано неудачно, я могу предположить, что он был успешным?
Я предполагаю, что если исключение SFTPException выбрано неудачно, я могу предположить, что он был успешным?
Это верно. Различные функции ChannelSftp.put()
генерируют исключение, если они по какой-либо причине не работают. Если вы хотите дважды проверить, вы можете позвонить ChannelSftp.stat()
или ...lstat()
в удаленное имя файла, чтобы проверить его. Но имейте в виду, что другой процесс может гипотетически удалить или переместить удаленный файл, прежде чем вы сможете его проверить.
Обычно вам не требуется доступ к входным или выходным потокам ChannelSftp
. getExitStatus()
сообщит вам статус выхода сеанса SFTP в целом, а не результат конкретной операции.
В JCraft есть примерная программа, иллюстрирующая, как сделать SFTP, который может вам пригодиться.