我正在尝试使用JSCH库0.1.51(最新版本)从SFTP下载文件。在循环中,我得到了异常。文件已成功下载到我项目的数据文件夹中,它的大小与SFTP上的大小差不多,但程序永远不会停止执行。
离开它几分钟后就会抛出异常。
编辑: 我发现如果它只是一个小文件,那么一切都还可以。如果它是1MB,但我需要下载20MB,我不会说这可能是个问题。
EDIT3:我也使用了apache库,它做了同样的事情。我发现的另一件事是:它下载了几乎整个文件,除了最后一行...为什么它暂停下载非常接近结束 - 并且它不是大小问题。
EDIT4:我尝试了不同的SFTP,它有效......为什么?
另外一件事,当我上传回SFTP文件时,该文件已被程序下载,然后尝试再次下载它的工作原理......什么......?
可能是带编码的东西,还是文件末尾的东西错了?它只是简单的csv文件所以..到目前为止我还不知道。
代码:
try {
JSch jsch = new JSch();
session = jsch.getSession(SFTPUSER, SFTPHOST);
session.setPassword(SFTPPASS);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
channelSftp.cd(SFTPWORKINGDIR);
byte[] buffer = new byte[1024];
BufferedInputStream bis = new BufferedInputStream(channelSftp.get("ELQ_contacts.csv"));
File newFile = new File("data\\ELQ_contacts.csv");
OutputStream os = new FileOutputStream(newFile);
BufferedOutputStream bos = new BufferedOutputStream(os);
int readCount;
while ((readCount = bis.read(buffer)) > 0) {
bos.write(buffer, 0, readCount);
os.flush();
bos.flush();
}
System.out.println("Done.");
os.close();
bis.close();
bos.close();
session.disconnect();
channel.disconnect();
channelSftp.quit();
} catch (Exception ex) {
ex.printStackTrace();
}
ERROR:
at java.io.PipedInputStream.read(Unknown Source)
at java.io.PipedInputStream.read(Unknown Source)
at java.io.InputStream.skip(Unknown Source)
at com.jcraft.jsch.ChannelSftp.skip(ChannelSftp.java:2894)
at com.jcraft.jsch.ChannelSftp.access$600(ChannelSftp.java:36)
at com.jcraft.jsch.ChannelSftp$RequestQueue.cancel(ChannelSftp.java:1246)
at com.jcraft.jsch.ChannelSftp$2.read(ChannelSftp.java:1402)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at SFTP.SFTP.null(Unknown Source)
at Main.Main.main(Main.java:14)
答案 0 :(得分:5)
我认为使用
更好channelSftp.get(String src, OutputStream dst);
它更容易,方法实现为您控制服务器流。
希望这有帮助。
答案 1 :(得分:0)
根据vzamanillo的建议,您最好使用downloading files using Sftp提供的方法
channelSftp.get(String src, OutputStream dst);
以下是显示其实际用途的更新代码:
try {
JSch jsch = new JSch();
session = jsch.getSession(SFTPUSER, SFTPHOST);
session.setPassword(SFTPPASS);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
channelSftp.cd(SFTPWORKINGDIR);
File newFile = new File("data\\ELQ_contacts.csv");
OutputStream os = new FileOutputStream(newFile);
channelSftp.get("ELQ_contacts.csv", os);
os.close();
session.disconnect();
channel.disconnect();
channelSftp.quit();
} catch (Exception ex) {
ex.printStackTrace();
}