如何使用FTP协议继续读取InputStream

时间:2012-10-17 08:16:10

标签: java ftp inputstream skip bufferedinputstream

我正在学习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分钟)。之后我意识到有一个跳过方法,但我想它做同样的事情,因为它需要几乎相同的时间。

是否有更快的方法从特定字节开始读取文件?或者我应该以另一种方式做到这一点?或者这是唯一的方法?

2 个答案:

答案 0 :(得分:2)

您可以使用apache.commons.net.ftp.FTPClient(位于commons-net.jar库中)。

你有方法:setRestartOffset(yourOffset),在检索文件之前使用它,文件数据将从指定的偏移量开始。

答案 1 :(得分:0)

我还没有查看FTP的全部细节,但是,跳过输入流只会读取已读取的字节。你需要做的是告诉服务器只发送你还没有的字节。

在HTTP和FTP中,这是RANGE标头。 This question详细介绍了如何为FTP执行此操作。