Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JSCH(android)通过SFTP下载文件_Java_Android_Sftp_Jsch_Download - Fatal编程技术网

Java 使用JSCH(android)通过SFTP下载文件

Java 使用JSCH(android)通过SFTP下载文件,java,android,sftp,jsch,download,Java,Android,Sftp,Jsch,Download,我正在尝试使用SFTP制作一个从服务器下载文件的应用程序。每当我运行调试器时,一切似乎都很好,没有错误。我的日志显示它已下载指定的文件。然而,我似乎无法在我的设备中的任何地方找到应该下载的文件。有什么帮助吗 import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Menu; import andr

我正在尝试使用SFTP制作一个从服务器下载文件的应用程序。每当我运行调试器时,一切似乎都很好,没有错误。我的日志显示它已下载指定的文件。然而,我似乎无法在我的设备中的任何地方找到应该下载的文件。有什么帮助吗

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

import java.util.List;


public class MainActivity extends Activity {

    private String user = "user";
    private String pass = "pass";
    private String host = "hostname";
    private int portNum = 22;

    private String fileName = "sample.txt";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new AsyncTask<Void, Void, List<String>>() {
            @Override
            protected List<String> doInBackground(Void... params) {
                try {
                    Downloader(fileName);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

        }.execute();
    }

    public void Downloader(String fileName) {

        JSch jsch = new JSch();
        Session session = null;

        String knownHostsDir = "/home/user/";

        try {
            jsch.setKnownHosts(knownHostsDir);
        } catch (JSchException e) {
            e.printStackTrace();
        }

        try {

            session = jsch.getSession(user, host, portNum);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setPassword(pass);
            session.connect();

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

            Log.d(fileName, " has been downloaded");

            sftpChannel.exit();
            session.disconnect();

        } catch (JSchException e) {
            e.printStackTrace();
        } catch (SftpException e) {
            e.printStackTrace();
        }
    }

}
不会将远程文件写入本地文件。它返回一个InputStream。您应该从InputStream读取远程文件的内容,例如:

try (FileOutputStream out = new FileOutputStream("/some/file")) {
    try (InputStream in = sftpChannel.get(fileName)) {
        // read from in, write to out
        byte[] buffer = new byte[1024];
        int len;
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
    }
}
另外,还有一些方法可以将远程内容写入本地文件

try (FileOutputStream out = new FileOutputStream("/some/file")) {
    try (InputStream in = sftpChannel.get(fileName)) {
        // read from in, write to out
        byte[] buffer = new byte[1024];
        int len;
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
    }
}