首页 > 解决方案 > 使用 JSch 将文件内容下载到字符串

问题描述

我需要通过 SSH 从 RaspberryPi Model 3b+ 下载一个 txt 文件,并希望在 android 设备上存储另一个文件。问题是文件下载失败。

IDE:Android Studio | SSH 库:JSch

我尝试了很多不同的代码示例,几乎所有的代码都是一样的。但他们也没有工作。其他人的解决方案正在处理异步任务。如果这是我的问题的解决方案,有人可以为异步部分编写示例代码吗?我真的不知道如何使用它。

这是我的代码:

public static String username = "BIOGAS";
public static String host = "192.168.1.29";
public static String password = "clientOG58";
public static String targetFile = "/home/BIOGAS/ies/data.txt";
public static int port = 22;

public String download() throws Exception {
    JSch jsch = new JSch();
    Session session = null;
    String r = "No Data";
    try {
        session = jsch.getSession(username, host, port);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword(password);
        session.connect();

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp sftpChannel = (ChannelSftp) channel;

        r = "" + sftpChannel.get(targetFile).toString();

        sftpChannel.exit();
        session.disconnect();
    } catch (JSchException e) {
        e.printStackTrace();
    } catch (SftpException e) {
        e.printStackTrace();
    }

    return r;
}

我希望该文件将作为字符串下载,并且该字符串将作为返回语句返回。

标签: javasshstreamsftpjsch

解决方案


InputStream.toString()不会将流的内容转换为字符串。InputStream不实现toString()方法。因此,您实际上是在调用基本Object.toString实现,这是无用的。

有关正确的代码,请参阅如何在 Java 中将 InputStream 读取/转换为字符串?

例如,在 Java 8 中,您可以执行以下操作:

String output =
    new BufferedReader(new InputStreamReader(channelSftp.get(targetFile)))
        .lines().collect(Collectors.joining("\n"));

强制警告:不要StrictHostKeyChecking=no用于盲目接受所有主机密钥。那是一个安全漏洞。您失去了对MITM 攻击的保护。

有关正确(且安全)的方法,请参阅:
How to resolve Java UnknownHostKey, while using JSch SFTP library?


推荐阅读