从Unix到Java的文件传输进度条

时间:2014-02-19 04:20:22

标签: java java-ee progress-bar sftp jsch

我知道这个问题听起来很重复,但区别在于我正在尝试实现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文件传输。

1 个答案:

答案 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类。