JSch не загружает полный файл на удаленный SFTP-сервер, только частичный - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь использовать библиотеку Jsch для переноса локально созданного файла XML (собранного из объекта Java с использованием JAXB) на удаленный сервер. Однако файл загружается только частично. Отсутствует конечный тег и произвольное количество символов в конце.

Мой код выглядит следующим образом (TradeLimits - это аннотированный класс JAXB Java класс)

TradeLimits limits = getTradeLimits(); //complex object with many fields
JSch jsch = new JSch();
jschSession = jsch.getSession(username, remoteHost);

//to avoid unknown host issues
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
jschSession.setConfig(config);

jschSession.setPassword(password);
jschSession.setPort(22);
jschSession.connect();

ChannelSftp channelSftp = (ChannelSftp) jschSession.openChannel("sftp");
channelSftp.connect();

jaxbContext = JAXBContext.newInstance(TradeLimits.class);           
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //for pretty print
marshaller.marshal(limits, channelSftp.put(limitUploadPathString)); //this uploads only partial xml file to sftp server
marshaller.marshal(limits, System.err)); //THIS WORKS CORRECTLY AND THE FULL XML IS PRINTED!        

channelSftp.disconnect();
channelSftp.exit();

Обратите внимание, что это не может быть проблемой JAXB, поскольку в другом месте будет напечатан полный XML, но только частичное загружается на удаленный сервер. В чем может быть проблема? Заранее спасибо!

1 Ответ

2 голосов
/ 08 января 2020

Всегда гарантируйте, что вы очищаете / закрываете OutputStream, когда закончите запись в него.

try(OutputSteam fileStream = channelSftp.put(limitUploadPathString)) {
  marshaller.marshal(limits, fileStream);
}
...