使用JSch将文件内容下载到字符串

时间:2019-05-20 15:03:26

标签: java ssh stream sftp jsch

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

IDE:Android Studio | SSH库:JSch

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

在这里输入我的代码:

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

我希望文件将以字符串形式下载,并且该字符串将以return语句的形式返回。

1 个答案:

答案 0 :(得分:0)

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

有关正确的代码,请参见How do I read / convert an InputStream into a String in Java?

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

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

强制性警告:请勿使用StrictHostKeyChecking=no盲目接受所有主机密钥。那是一个安全漏洞。您失去了针对MITM attacks的保护。

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