我正在学习Java OOP。我的程序通过FTP下载文件。我想在它再次启动时继续下载。这是我的代码:
URL urlName = new URL(url);
URLConnection con = urlName.openConnection();
BufferedInputStream in = new BufferedInputStream(con.getInputStream());
int i = 0;
long downloadedSizeKB;
System.out.println("before skip");
long k = in.skip(counter);
System.out.println(k);
byte[] bytesIn = new byte[1024];
while ((i = in.read(bytesIn)) >= 0) {
if(counter >= alreadyDownloadedBytes) {
out.write(bytesIn, 0, i);
downloadedSizeKB = counter/1024;
downSize.setText(downloadedSizeKB + " KB downloaded...");
while(isPaused) {
downSize.setText(downloadedSizeKB + " KB PAUSED");
Thread.sleep(1000);
}
}
counter += i;
}
in.close();
起初我尝试读取它与之前下载的文件的长度一样多,然后从那一点继续读取和写入。在恢复下载之前读取文件需要花费太多时间(类似100MB需要1-2分钟)。之后我意识到有一个跳过方法,但我想它做同样的事情,因为它需要几乎相同的时间。
是否有更快的方法从特定字节开始读取文件?或者我应该以另一种方式做到这一点?或者这是唯一的方法?
答案 0 :(得分:2)
您可以使用apache.commons.net.ftp.FTPClient(位于commons-net.jar库中)。
你有方法:setRestartOffset(yourOffset),在检索文件之前使用它,文件数据将从指定的偏移量开始。
答案 1 :(得分:0)
我还没有查看FTP的全部细节,但是,跳过输入流只会读取已读取的字节。你需要做的是告诉服务器只发送你还没有的字节。
在HTTP和FTP中,这是RANGE标头。 This question详细介绍了如何为FTP执行此操作。