В этой статье описывается многопоточная загрузка Java. Поделитесь этим для вашей ссылки, следующим образом:
Использование многопоточных файлов для загрузки файлов может быстрее загружать файлы. Причина, по которой многопоточные файлы быстро, заключается в том, что они занимают много ресурсов сервера. Например: предположим, что сервер обслуживает до 100 пользователей одновременно, а один поток на сервере соответствует одному пользователю. 100 потоков не выполняются одновременно на компьютере, но выполняются в свою очередь процессором. Если приложение A использует 99 потоков для загрузки файлов, оно эквивалентно занимать ресурсы 99 пользователей. Предположим, что среднее время выполнения, выделяемое ЦП для каждого потока в течение одной секунды, составляет 10 мс. Приложение A получает время выполнения 990 мс за одну секунду на сервере, в то время как другие приложения имеют только время выполнения 10 мс за одну секунду. Точно так же, как кран, когда выход воды в секунду равна, это определенно больше воды для 990 миллисекунд, чем для 10 миллисекунд.
Процесс реализации многопоточной загрузки:
1. Сначала получите длину загруженного файла, а затем установите длину локального файла.
Httpurlconnection.getContentLength (); randomAccessfile file = new randomAccessfile ("oudao.exe", "rw"); file.setLength (fileSize); // Установить длину локального файла2. Рассчитайте длину данных и расположение загрузки каждого потока на основе длины файла и количества потоков. Например: длина файла составляет 6 м, а количество потоков составляет 3, а затем длина данных, загруженных каждым потоком, составляет 2 м, а местоположение, где каждый поток начинает загружать, показана на рисунке ниже.
3. Используйте поле заголовка диапазона HTTP, чтобы указать, откуда каждый поток начинает загружать, например: указать загрузку файла из позиции 2M файла, код следующим образом:
Копия кода выглядит следующим образом: httpurlConnection.setRequestProperty («Range», «Bytes = 2097152-»);
4. Сохраните файл и используйте класс randomaccessfile, чтобы указать, откуда каждый поток начинает записывать данные из локального файла.
Randomaccessfile threadfile = new randomaccessfile ("<span style =" font-family: arial, helvetica, sans-serif; "> youdao.exe </span> <span style =" font-family: arial, helvetica, sans-serif; ">", "rw"); где в файлеНиже приведено конкретный класс реализации:
Перед написанием класса реализации мы должны сначала разместить файл для загрузки на сервер и развернуть:
Я поместил его здесь в каталоге d: /tomcat/apache-tomcat-7.0.37/webapps/doudou и запустите startup.bat в рамках d: /tomcat/apache-tomcat-7.0.37/bin
1.downloadtest.java
Пакет www.csdn.net.down; импорт java.io.file; import java.io.fileinputstream; импорт java.io.fileOutputStream; импорт java.io.ioexception; импорт java.io.inputstream; импорт java.io.randomaccessfile; импорт java.net.httpurloncemonection; java.net.malformedurlexception; import java.net.url; public class downloadtest {public file file; public randomaccessfile Accessfile; // количество потоков Public Static Int Threadnum = 3; // Каждый поток отвечает за загрузку int blocksize; // Создание пути доступа public String Path = "http: // localhost: 8080/doudou/youdao.exe"; public static int ThreadCount; // Количество public void testdown () {try {// Создать URL -объект url url = new URL (path); // Создать объект httpurlConnection httpurlconnection httpurlconnection = (httpurlconnection) url .openconconection (); // Установить метод отправки запросов httpurlconnection.setrequestmethod ("get"); // Установить, будет ли время -аут запроса httpurlconnection.setConnecttimeout (5000); // Установить httpurlConnection .SetRequestProperty («Пользовательский агент», "Mozilla/5.0 (совместимо; msie 10.0; Windows NT 6.2; Trident/6.0)"); // Будет ли ответ успешным, если (httpurlConnection.getResponseCode () == 200) {// Получить размер файла int size = httpurlConnection.getContentLength (); System.out.println ("Размер файла" + размер); // Создать файл файла = новый файл ("oudao.exe"); accessfile = new randomaccessfile (файл, "rwd"); // Установить файл Size AccessFile.SetLength (размер); // Загрузите размер каждого потока Blocksize = size / threadnum; // Откройте три потока, чтобы управлять этим файлом для (int i = 1; i <= threadnum; i ++) {// 1 2 3 // Рассчитайте исходную позицию каждого потока int int startize = (i - 1) * blocksize; // конечное положение int endize = (i) * blocksize; // Когда поток является последним потоком if (i == threadnum) {// определить, больше ли размер файла, чем вычисленная конечная позиция if (size> endsize) {// конечная позиция равна размеру файла endsize = size; }} // Создать случайное чтение для каждого потока randomAccessfile threadAccessfile = new randomAccessfile (файл, "rwd"); новая ветка (новый загрузка thread (i, ThreadAccessfile, Startize, Endsize, Path)). start (); }}} catch (malformedurlexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); }} public static void main (string [] args) {downloadTest downloadTest = new DownloadTest (); // Позвоните методу загрузки загрузки }} класс загрузка загрузки // Каждый поток имеет accessfile file -объект Thread1 Thread23 // Начальная позиция загрузки потока Public int int Starsize; Public int Endight; // Путь пути загрузки файла Public String Path; public int threadid; // Идентификация потока Public DownloadThread (int ThinkId, randomAccessFile AccessFile, int Starsize, int endsize, String Path) {this.ThreadId = ThreadId; this.accessfile = accessfile; this.startsize = starsize; this.endsize = endsize; this.path = path; } @Override public void run () {// выполнить метод запуска try {// Создать файл файла Filefile = новый файл (ThreadId + ".txt"); if (threadfile.exists ()) {// Читать содержимое файла // Создание объекта ввода ввода файла файла fileInputStream fis = new FileInputStream (ThreadFile); // Использовать класс инструментов для чтения байтовых данных [] = StreamTools.istodata (FIS); // конвертировать в строковую строку Threadlen = new String (data); if ((threadlen! = null) && (! "". Equals (threadlen))) {starsize = integer.valueof (threadlen); // Решить ошибку 416bug if (starsize> endsize) {starsize = endsize - 1; }}} // Создать URL -объект url url = new URL (path); // Создать объект httpurlConnection httpurlconnection httpurlconnection = (httpurlconnection) url .openconconection (); // Установить заголовок запроса httpurlconnection.setrequestmethod ("get"); // Установить, будет ли время -аут запроса httpurlconnection.setConnecttimeout (5000); // Установить httpurlConnection .SetRequestProperty («Пользовательский агент», "Mozilla/5.0 (совместимо; msie 10.0; Windows NT 6.2; Trident/6.0)"); // Настройки ключей httpurlConnection.setRequestProperty ("range", "bytes =" + starsize + "-" + endsize); // Вывод текущей системы потока. System.out.println («Текущий поток» + ThreadId + «Запуск начала:« + Startsize + »Загрузить конечная позиция:« + endsize); // Успешный ответ // Установить начальную позицию случайных файлов access files accessfile.seek (starsize); // Получить соответствующий объект потока inputstream is = httpurlConnection.getInputStream (); // Создать байтовый буфер объекта выходного потока [] = новый байт [1024]; int len = 0; int threadtotal = 0; // Сохранить запись после загрузки каждого потока/ while ((len = is.read (buffer))! = -1) {accessfile.write (буфер, 0, len); ThreadTotal += len; // Запишите длину, которую вы записываете // XML -файл // Запишите длину загрузки файла через файл файл fileOutputStream fos = new FileOutputStream (ThreadFile); fos.write ((threadtotal + "") .getbytes ()); fos.flush (); fos.close (); } accessfile.close (); is.close (); System.out.println (TreadId + "Выполнение потока завершено"); // Операция потока Synchronized (downloadTest.class) {DownloadLoadTest.ThreadCount ++; if (downloadtest.threadcount> = downloadloadtest.threadnum) {for (int i = 1; i <= DownloadTest.Threadnum; i ++) {file file = new File (i+". txt"); if (file.exists ()) {file.delete (); }}}}} catch (malformedurlexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); }}}2. Streamtools.java Encapsulation of Streaming Tools
Пакет www.csdn.net.nown; импорт java.io.bytearrayoutputstream; import java.io.ioexception; import java.io.inputStream; открытый класс Streamtools {public Static Byte [] istodata (inputStream IS) throuseexception {// byTeArrayOutputeam = neweAremeAmTeam = neweARAPEAM / neweARAPEAM) // буферная область для чтения данных байтового буфера [] = новый байт [1024]; // Читать запись длины int len = 0; // чтение цикла while ((len = is.read (buffer))! = -1) {bops.write (buffer, 0, len); } // Преобразовать контент чтения в байтовые байтовые данные [] = bops.tobytearray (); bops.flush (); bops.close (); is.close (); вернуть данные; }}Я надеюсь, что эта статья будет полезна для всех Java Programming.