Java SFTP下载失败';完不成

Java SFTP下载失败';完不成,java,sftp,Java,Sftp,我正在尝试使用JSCH库0.1.51(最新版本)从SFTP下载文件。在while循环中,我得到了异常。该文件已成功下载到我的项目的数据文件夹中,它的大小与SFTP上的文件大致相同,但程序从未停止执行 像这样离开几分钟后,它抛出了异常 编辑: 我发现,如果它只是一个小文件,那么一切都是好的。如果大约1MB,但我需要下载20MB,我不会说这可能是个问题 EDIT3:我还使用了apache库,它也做了同样的事情。我发现的另一件事是:除了最后几行,它几乎下载了整个文件。。。为什么它会在快结束时暂停下载?

我正在尝试使用JSCH库0.1.51(最新版本)从SFTP下载文件。在while循环中,我得到了异常。该文件已成功下载到我的项目的数据文件夹中,它的大小与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();
    }
错误:

    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)

我认为使用它更好

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

为什么不使用channelSftp.get(stringsrc,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();
}