Jsch sftp upload/ход загрузки
Я новичок в JSch и java. Мне удалось получить некоторые коды и понять его каким-то образом, но я застрял на одном пункте. Следующий код загружает файл с SSH-сервера, но мне нужен индикатор выполнения, который показывает процент скопированного файла. Как я могу это сделать? Я буду очень признателен вам за помощь.
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpProgressMonitor;
public class SFTPExample {
public static void main(String args[]) throws Exception {
String user = "root";
String password = "password";
String host = "192.168.0.5";
int port = 22;
String knownHostsFilename = "/home/world/.ssh/known_hosts";
String sourcePath = "/media/nfs/genotype.txt";
String destPath = "genotype.txt";
JSch jsch = new JSch();
jsch.setKnownHosts(knownHostsFilename);
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
session.connect();
ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
sftpChannel.connect();
System.out.println("Downloading test file");
sftpChannel.get(sourcePath, destPath);
sftpChannel.exit();
session.disconnect();
}
}
1 ответ:
Есть методы в com.jcraft.jsch.ChannelSftp , который вы используете для передачи обратного вызова. Посмотрите на
void get(java.lang.String src, java.lang.String dst, SftpProgressMonitor monitor)
Методы и com.jcraft.jsch.Интерфейс SftpProgressMonitor . В нижней части этогопримера кода (это довольно грязно) вы найдете реализацию SftpProgressMonitor, которая использует свои методы обратного вызова
count(long)
иend()
для манипулирования javax.качать.ProgressMonitor .
count(long)
периодически звонит, когда есть какие-то байты, которые были переданы, иend()
вызывается, когда передача закончилась. Таким образом, действительно простая реализация SftpProgressMonitor может быть:public class SystemOutProgressMonitor implements SftpProgressMonitor { public SystemOutProgressMonitor() {;} public void init(int op, java.lang.String src, java.lang.String dest, long max) { System.out.println("STARTING: " + op + " " + src + " -> " + dest + " total: " + max); } public boolean count(long bytes) { for(int x=0; x < bytes; x++) { System.out.print("#"); } return(true); } public void end() { System.out.println("\nFINISHED!"); } }
Я бы тогда создал экземпляр этого и передал его
get()
sftpChannel.get(sourcePath, destPath, new SystemOutProgressMonitor());