Как возобновить чтение InputStream с использованием протокола FTP

Я изучаю Java ООП. Моя программа загружает файл через 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();

Сначала я пытался прочитать его столько же, сколько длина ранее загруженного файла, а затем возобновить чтение и запись с этой точки. Чтение файла перед возобновлением загрузки занимает слишком много времени (1-2 минуты на 100 МБ). После этого я понял, что есть метод пропуска, но я думаю, что он делает то же самое, поскольку занимает почти такое же количество времени.

Есть ли более быстрый способ начать чтение файла с определенного его байта? Или я должен сделать это как-то по-другому? Или это единственный способ?


person Onur Yirmibeş    schedule 17.10.2012    source источник
comment
взгляните на stackoverflow.com/questions/2792963/   -  person G-Man    schedule 17.10.2012


Ответы (2)


Вы можете использовать apache.commons.net.ftp.FTPClient (находится в библиотеке commons-net.jar).

У вас есть такие методы, как: setRestartOffset(yourOffset), используя его перед извлечением файла, данные файла будут начинаться с указанного смещения.

person sgroh    schedule 17.10.2012

Я не искал полную информацию о FTP, но да, пропуск входного потока просто прочитает уже прочитанные байты. Что вам нужно сделать, так это указать серверу отправлять только те байты, которых у вас еще нет.

В HTTP и FTP это заголовок RANGE. Этот вопрос имеет подробности того, как это сделать для FTP.

person EdC    schedule 17.10.2012
comment
спасибо, я не знаю, как точно применить этот заголовок диапазона к моему коду Java, но вы даете мне где-нибудь, чтобы начать поиск. - person Onur Yirmibeş; 17.10.2012