0
我想在下載它之前獲取文件大小,以便我可以將其用於進度條。我找到了這個Post,但找不到確切的命令來獲取文件大小.Plz幫助!使用Jsch獲取文件大小fron Unix遠程服務器
我想在下載它之前獲取文件大小,以便我可以將其用於進度條。我找到了這個Post,但找不到確切的命令來獲取文件大小.Plz幫助!使用Jsch獲取文件大小fron Unix遠程服務器
JSch已經提供了SftpProgressMonitor
來監控上傳以及下載進度。它有三個功能,其中一個init
會給你一個遠程文件大小。我準備了一個小程序,可以根據需要直接使用或定製。
IOUtil.java
public final class IOUtil {
private IOUtil() {}
public final DecimalFormat PERCENT_FORMAT = new DecimalFormat("#.##");
private static final double KB = 1024.0d;
private static final double MB = KB * 1024.0d;
public static String getFileSize(final long fileSize) {
if (fileSize < KB) {
return fileSize + " bytes";
} else if (fileSize < MB) {
return DECIMAL_FORMAT.format((fileSize/KB)) + " KB";
} else
return DECIMAL_FORMAT.format((fileSize/MB)) + " MB";
}
public static String calculatePercent(double part, double whole) {
return PERCENT_FORMAT.format ((part/whole) * 100);
}
}
DownloadProgressMonitor.java
public class DownloadProgressMonitor implements SftpProgressMonitor {
private double bytesCopied = 0L;
private double fileSize = 0L;
private String src;
private String dest;
public DownloadProgressMonitor() {
IOUtil.PERCENT_FORMAT.setRoundingMode(RoundingMode.CEILING);
}
@Override
public void init(int operation, String src, String dest, long fileSize) {
this.fileSize = Double.parseDouble(fileSize + "");
this.src = src;
this.dest = dest;
System.out.println("Downloading file: " + src + " (" + IOUtil.getFileSize(fileSize) + ")...");
}
@Override
public boolean count(long bytesTransferred) {
bytesCopied += bytesTransferred;
// watch out this is only print not println
System.out.print(IOUtil.calculatePercent(bytesCopied, fileSize) + "%...");
return bytesTransferred != 0;
}
@Override
public void end() {
System.out.println(src + " downloaded \n");
}
}
在您的實現類,請使用如下
ChannelSftp sftp = null; // initiate this channel
sftp.get(remoteFileName,
destDir,
new DownloadProgressMonitor(),
ChannelSftp.OVERWRITE);
這將無覆蓋工作任何額外的代碼。
它看起來像答案是正確的,在這個問題的答案。當您嘗試使用建議的代碼時發生了什麼? –
@Duncan:SftpATTRS在我的Jasch JAR中不可用 –