java - SFTP 下载未完成

标签 java sftp

我正在尝试使用 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);

它更简单,方法实现为您控制服务器流。

希望这有帮助。

关于java - SFTP 下载未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757276/

相关文章:

java - 通过 SSH 信任使用 DefaultSftpSessionFactory 进行 SFTP 会引发异常

java - HttpServletResponse将多个图像写入OutputStream(在同一查询中)

java - 文件名前缀上的 Camel 路由

java - 如何在Java中使用SFTP获取目录的最新文件?

arm - 如何解决错误 "Exception in thread "AWT-EventQueue- 0"java.lang.NullPointerException:"?

java - 将文件上传到只能通过另一个 SSH/SFTP 服务器访问的 SFTP 服务器

sftp - 尝试使用 Apache Mina 为 SFTP 测试服务器实现 PublicKey 身份验证。但是没有调用 Authenticate 方法

Java - 如何用txt文件的某些部分填充组合框

java - 我们在哪里可以使用 ArrayList< ?扩展我的类>

Java:为什么矩阵接受大于预定义长度的行?