2014-11-05 143 views
2

我想从SFTP下载文件使用JSCH库0.1.51(最新版本)。在while循环期间,我得到异常。文件已成功下载到我的项目的数据文件夹中,它的大小与SFTP上的大小基本相同,但程序永远不会停止执行。SFTP下载没有完成

离开它几分钟后就会抛出异常。

编辑: 我发现,如果它只是一个小文件,那么一切都很好。如果它是1MB,但我需要下载20MB,我不会说这可能是一个问题。

EDIT3:我也使用apache库,它也做同样的事情。另一件事我发现:它几乎下载整个文件,除了最后一行...为什么它暂停下载非常接近结束 - 它不是尺寸问题。

编辑4:我试过不同的SFTP,它已经工作......为什么?

另一件事,当我上传回SFTP文件,这是由程序下载,然后尝试再次下载它的作品...什么?...?

它可能是编码的东西,或在文件末尾的东西是错的?它只是简单的CSV文件,所以..我目前还不知道。

CODE:

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(); 
    } 

错误:

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

为什么你不使用channelSftp.get (String src,OutputStream dst);? – vzamanillo 2014-11-06 15:34:12

+0

创建答案就是这样......我早早发现了,但我可能只是为了表示你的意愿。谢谢:) – 2014-11-06 20:32:55

+0

谢谢Ondrej :) – vzamanillo 2014-11-06 20:42:46

回答

5

我认为是更好的使用

channelSftp.get(String src, OutputStream dst); 

更容易和方法实现控制服务器流为您服务。

希望这会有所帮助。

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(); 
}