【问题标题】:How to resume reading an InputStream using the FTP protocol如何使用 FTP 协议继续读取 InputStream
【发布时间】:2012-10-07 10:50:56
【问题描述】:

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

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

【问题讨论】:

标签: java ftp inputstream skip bufferedinputstream


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,我不知道如何将此范围标头准确地应用到我的 java 代码中,但您给了我开始搜索的地方。
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2017-03-10
    • 1970-01-01
    • 2016-02-17
    • 2011-07-31
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多