我知道这个问题听起来很重复,但区别在于我正在尝试实现Unix-Java文件传输的进度条。我使用下面的代码将文件从Unix下载到我的本地主机。
String SFTPHOST = "xxx.xx.xx.xxx";
int SFTPPORT = 22;
String SFTPUSER = "abc";
String SFTPPASS = "pwd";
String SFTPWORKINGDIR = "/home/Shashank";
String SFTPDEST="G:\\xyz\\update.txt";
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
try{ JSch jsch = new JSch();
session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);
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("update.txt"));
File newFile = new File(SFTPDEST);
OutputStream os = new FileOutputStream(newFile);
BufferedOutputStream bos = new BufferedOutputStream(os);
int readCount;
//System.out.println("Getting: " + theLine);
while( (readCount = bis.read(buffer)) > 0) {
System.out.println("Writing: " );
bos.write(buffer, 0, readCount);
}
bis.close();
bos.close();
}catch(Exception ex){
ex.printStackTrace();
}
请建议我如何在此代码中使用进度条。我尝试了JSch sftp upload/download progress链接,但我认为这不是Java-unix文件传输。
答案 0 :(得分:0)
基本上你需要在类中实现SftpProgressMonitor接口,然后将它作为参数传递给你的ChannelSftp put()或get()调用..(例如在你的情况下
BufferedInputStream bis = new BufferedInputStream(channelSftp.get("update.txt"));
变为
BufferedInputStream bis = new BufferedInputStream(channelSftp.get("update.txt", implementsSftpProgressMonitor));
在我的情况下,我刚刚在类中实现了SftpProgressMonitor方法,该方法处理SFTP传输并将其传递给方法,无论对你有用。
此接口有3个方法,put和get方法将在传输文件的过程中调用这些方法,以允许您实现进度条。
init() - 将在传输开始时调用,并传递一些有用的参数,包括总文件大小。
count() - 在文件传输期间定期调用,并传递自上次调用以来已传输的当前数据量。您的实现类应跟踪已传输的totat,然后使用它来计算总进度。您还可以在此方法的实现中传递返回值,以允许取消传输。
end() - 在传输完成或被取消后调用。
希望使用此功能,您可以了解如何显示应用程序的进度。
编辑: http://www.jcraft.com/jsch/examples/Sftp.java.html提供了此接口的示例实现,向下滚动一下,直到进入内部MyProgressMonitor类。