Поток можно понять как канал загрузки. Один поток - это канал загрузки файла. Несколько потоков означает открытие нескольких каналов загрузки одновременно. Когда сервер предоставляет сервисы загрузки, пользователь загружает пропускную способность. Когда приоритет будет таким же, общий сервер будет равномерно распределять общий поток загрузки. Это не сложно понять. Если у вас много потоков, тем быстрее вы загружаете его.
Популярное программное обеспечение для загрузки поддерживает многопоточную загрузку и поддерживает загрузки паузы. Когда вы начнете снова, вы не будете загружаться с нуля.
Шаги по реализации двух функций следующие:
(1) При подключении к файлу загрузки ресурса сначала определите размер файла ресурса и создайте временный файл того же размера локально для хранения данных загрузки.
(2) Определите размер файла, необходимый для каждого потока на основе количества потоков
(3) Определите место для загрузки начала и конец каждого потока в соответствии с размером файла и количеством потоков, загруженных каждым потоком, и определите место начала и окончание загрузки каждого потока в соответствии с размером файла и количеством потоков, загруженных каждым потоком.
(4) Чтобы реализовать функцию загрузки точки останова, необходимо отметить местоположение загрузки каждого потока в реальном времени, чтобы облегчить загрузку прогресса в начале в следующий раз.
Откройте 3 -го скачать.
Общий код реализации заключается в следующем (все еще есть много возможностей для оптимизации, поэтому не просто смотрите на это, и это сделано)
Импорт java.io.bufferedReader; import java.io.file; import java.io.fileinputstream; import java.io.inputStreamReader; импорт java.io.randomaccessfile; импорт java.net.httpurlconnect Path = "http://soft3.xzstatic.com/2015/10/hsjj2ghgzh.rar"; public static int ThreadCount = 0; // объявить количество потоков Public Static void Main (String [] args) {try {url url = new URL (path); // Получить соединение httpurlconnection conn = (httpurlconnection) url.openconcection (); // Определите имя файла, получив строку подключения [] str = path.split ("/"); String fileName = str [5]; // Получить загрузочный файл size int filelength = conn.getContentLength (); System.out.println (имя файла); // Создать случайно написанный файл, который согласуется с размером сервера локально randomaccessfile raf = new randomaccessfile (имя файла, "Rwd"); System.out.println (fileLength); // тест raf.setLength (fileLength); // Пользовательский счет потоков ThreadCount = 3; // Рассчитайте размер данных, загружаемых каждым потоком int blocksize = filelength / threadcount; // Запуск потока Загрузка для (int ThinkId = 1; ThreadId <= ThreadCount; ThreadId ++) {// Core Code определите место загрузки, в котором каждый поток запускается и запускается int startpos = (ThreadId - 1) * blocksize; // Местоположение, в котором загрузка начинается int endpos = (ThreadId * Blocksize) - 1; // местоположение, в которое загрязнение не включает в себя последнюю часть) (ThreadId) ThinkSID). = filelength; } Новый поток (новый загрузку woodThread (ThreadId, StartPos, EndPos, Path)) .Start (); }} catch (Exception e) {e.printstackTrace (); }} // Реализация потока загрузки Static ClassloadThread реализует runnable {private int Threadid; частный int startpos; частный int endpos; частный путь строкости; public DownloadLoadThread (int ThreadId, int startPos, int endPos, String Path) {super (); this.ThreadId = thinkId; this.startpos = startpos; this.endpos = endpos; this.path = path; } public void run () {try {url url = new url (path); String [] str = path.split ("/"); String fileName = str [5]; Httpurlconnection conn = (httpurlconnection) url .openconcenection (); // Установить метод запроса URL (для получения подробной информации см. В API) conn.setrequestmethod ("get"); // установить 500 мс в качестве значения тайм -аута conn.setReadtimeout (5000); File file = new File (treadid + ".txt"); if (file.exists () && file.length ()> 0) {BufferedReader br = new BufferedReader (new InputStreamReader (new FileInputStream (file))); String savestartpos = br.readline (); if (savestartpos! = null && savestartpos.length ()> 0) {startpos = integer.parseint (savestartpos); }} // Обратите внимание на формат в двойных кавычках и не может содержать пространства (например, другие символы), в противном случае сообщается 416. conn.setrequestproperty ("range", "bytes =" + startpos + "-" + endpos); Randomaccessfile raf = new randomaccessfile (имя файла, "rwd"); // Хранить файл случайного записи в файл загрузки raf.seek (startpos); // Установить место для запуска системы загрузки. InputStream IS = conn.getInputStream (); байт [] b = новый байт [1024 * 1024 * 10]; int len = -1; int newpos = startpos; while ((len = is.read (b))! = -1) {randomaccessfile rr = new randomaccessfile (файл, "rwd"); // файл, хранящий tag Raf.write (b, 0, len); // Сохранить тег загрузки в указанную строку документа savapoint = string.valueof (newpos += len); rr.write (savapoint.getbytes ()); Rr.close (); } is.close (); raf.close (); System.out.println ("Загрузить заполнение"); } catch (Exception e) {e.printstackTrace (); }}}}Примечания:
(1) Понять метод расчета начальных и конечных позиций каждой загрузки потока (не включая последний поток, запустите с 0)
Начальное положение = (количество потоков - 1) * Длина (размер) файла, который будет загружен каждым потоком
End Position = (количество потоков * Размер файла, загруженный каждым потоком) -1
(2) Позиция начала загрузки, назначенная последним потоком, является конечной позицией предыдущего потока, а конечная позиция - длина файла.
Следовательно, длина файла, загруженная последним потоком, обычно не будет такой же, как в предыдущем потоке
(3) Путь загрузки этой демонстрации - это каталог, в котором проект Java расположен по умолчанию, а каталог не может содержать файлы с тем же именем, что и загруженный файл, в противном случае программа сообщит об ошибке сетевого запроса 416.
(4) ошибка, которую я совершил в реализации conn.setrequestproperty ("range", "bytes ="+startpos+"-"+endpos); Обязательно отметите, что в кавычках не обязательно есть дополнительные места и другие персонажи. У меня просто есть место в кавычках, но позиционирование ошибки всегда было ошибкой ввода, и очень больно найти неправильные.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.