Как загрузить файл по URL-адресу в Java

Вы хотите создать свой собственный набор данных для нового и инновационного приложения? Или, может быть, вы пытаетесь собрать данные для анализа для проекта колледжа и устали вручную загружать каждое изображение или CSV. Не волнуйтесь, в этой статье я объясню строительные блоки, необходимые для автоматизации загрузки файлов для такого рода задач. Прежде чем вы сможете создать приложение для загрузки и создания наборов данных для вас, вам необходимо знать основы, необходимые для автоматизации загрузки файлов.

Вы хотите создать свой собственный набор данных для нового и инновационного приложения? Или, может быть, вы пытаетесь собрать данные для анализа для проекта колледжа и устали вручную загружать каждое изображение или CSV. Не волнуйтесь, в этой статье я объясню строительные блоки, необходимые для автоматизации загрузки файлов для такого рода задач.

Прежде чем вы сможете создать приложение для загрузки и создания наборов данных для вас, вам необходимо знать основы, необходимые для автоматизации загрузки файлов с помощью кода Java. Правильное изучение основ поможет вам использовать их в соответствии с вашими конкретными потребностями, будь то приложение для внутреннего сервера или приложение для Android.

Есть несколько способов загрузить файл с помощью кода Java. Вот лишь несколько способов выполнения этой задачи:

Java IO

Самый простой и базовый пакет для загрузки файла из Интернета с использованием кода Java - это пакет ввода-вывода Java. Здесь мы будем использовать BufferedInputStream и URL для открытия и чтения файла по заданному адресу в файл в нашей локальной системе. Причина, по которой мы используем класс BufferedInputStream InputStream заключается в его способности к буферизации, которая дает нашему коду повышение производительности.

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

Класс java.net.URL в Java - это встроенная библиотека, которая предлагает несколько методов для доступа и управления данными в Интернете. В этом случае мы будем использовать openStream() класса URL Сигнатура метода для функции openStream() :

 public final InputStream openStream() throws IOException 

Функция openStream() работает с объектом класса URL Класс URL открывает соединение с заданным URL, а метод openStream() возвращает входной поток, который используется для чтения данных из соединения.

Второй класс, который мы будем использовать, - это BufferedInputStreamReader и FileOutputStream . Эти классы используются для чтения из файла и записи в него соответственно.

Вот полный код:

 try (BufferedInputStream inputStream = new BufferedInputStream(new URL("http://example.com/my-file-path.txt").openStream()); 
 FileOutputStream fileOS = new FileOutputStream("/Users/username/Documents/file_name.txt")) { 
 byte data[] = new byte[1024]; 
 int byteContent; 
 while ((byteContent = inputStream.read(data, 0, 1024)) != -1) { 
 fileOS.write(data, 0, byteContent); 
 } 
 } catch (IOException e) { 
 // handles IO exceptions 
 } 

Примечание . Возможно, вам потребуется добавить заголовок «User-Agent» к HTTP-запросу, поскольку некоторые серверы не разрешают загрузку с неизвестных клиентов.

Как видите, мы открываем соединение, используя URL а затем читаем его через объект BufferedInputStreamReader Содержимое читается как байты и копируется в файл в локальном каталоге с помощью FileOutputStream .

Чтобы уменьшить количество строк кода, мы можем использовать Files доступный в Java 7. Класс Files содержит методы, которые считывают все байты сразу, а затем копируют их в другой файл. Вот как это можно использовать:

 InputStream inputStream = new URL("http://example.com/my-file-path.txt").openStream(); 
 Files.copy(inputStream, Paths.get("/Users/username/Documents/file_name.txt"), StandardCopyOption.REPLACE_EXISTING); 

Java NIO

Java NIO - альтернативный пакет для обработки сетевых операций и операций ввода-вывода в Java. Основное преимущество пакета Java NIO заключается в том, что он неблокирующий и имеет возможности создания каналов и буферизации. Когда мы используем библиотеку ввода-вывода Java, мы работаем с потоками, которые читают данные побайтно. Однако пакет Java NIO использует каналы и буферы. Возможности буферизации и создания каналов позволяют системе копировать содержимое из URL-адреса непосредственно в предполагаемый файл без необходимости сохранять байты в памяти приложения, что было бы промежуточным шагом. Возможность работы с каналами повышает производительность.

Чтобы загрузить содержимое URL-адреса, мы будем использовать классы ReadableByteChannel и FileChannel

 ReadableByteChannel readChannel = Channels.newChannel(new URL("http://example.com/my-file-path.txt").openStream()); 

Класс ReadableByteChannel создает поток для чтения содержимого из URL-адреса. Загруженное содержимое будет передано в файл в локальной системе через соответствующий файловый канал.

 FileOutputStream fileOS = new FileOutputStream("/Users/username/Documents/file_name.txt"); 
 FileChannel writeChannel = fileOS.getChannel(); 

После определения файлового канала мы будем использовать метод transferFrom() для копирования содержимого, считанного из readChannel в место назначения файла с writeChannel объекта writeChannel.

 writeChannel 
 .transferFrom(readChannel, 0, Long.MAX_VALUE); 

transferFrom() и transferTo() намного эффективнее, чем работа с потоками с использованием буфера. Методы передачи позволяют нам напрямую копировать содержимое кеша файловой системы в файл в системе. Таким образом, прямое создание каналов ограничивает количество требуемых переключений контекста и повышает общую производительность кода.

Теперь, в следующих разделах, мы рассмотрим способы загрузки файлов с URL-адреса с использованием сторонних библиотек вместо основных компонентов функциональности Java.

Apache Commons IO

Библиотека ввода-вывода Apache Commons предлагает список служебных классов для управления операциями ввода-вывода. Теперь вы можете подумать, зачем нам это использовать, если у Java есть собственный набор библиотек для обработки операций ввода-вывода. Однако Apache Commons IO решает проблему переписывания кода и помогает избежать написания шаблонного кода.

Чтобы начать использовать библиотеку ввода-вывода Apache Commons, вам необходимо загрузить файлы jar с официального сайта . Когда вы закончите загрузку файлов jar, вам нужно добавить их, чтобы использовать их. Если вы используете интегрированную среду разработки (IDE), такую как Eclipse , вам нужно будет добавить файлы в путь сборки вашего проекта. Чтобы добавить файлы в свой проект, вам нужно будет щелкнуть по нему правой кнопкой мыши, выбрать параметр пути сборки, перейдя через «настроить путь сборки-> путь сборки», а затем выбрать параметр добавления внешних архивов.

Чтобы загрузить файл с заданного URL-адреса с помощью Apache Commons IO, нам потребуется FileUtils пакета. Для загрузки файла требуется всего одна строка кода, которая выглядит так:

 FileUtils.copyURLToFile( 
 new URL("http://example.com/my-file-path.txt"), 
 new File("/Users/username/Documents/file_name.txt"), 
 CONNECTION_TIMEOUT, 
 READ_TIMEOUT); 

Таймауты соединения и чтения указывают допустимое время, в течение которого соединение может оставаться в режиме ожидания или чтение из URL-адреса может прекратиться.

Другой класс пакета ввода-вывода Apache Commons, который можно использовать для загрузки файла через Интернет, - это класс IOUtils. Мы будем использовать метод copy(inputStream, fileOS) для загрузки файла в локальную систему.

 InputStream inputStream = new URL("http://example.com/my-file-path.txt").openStream(); 
 FileOutputStream fileOS = new FileOutputStream("/Users/username/Documents/file_name.txt"); 
 int i = IOUtils.copy(inpuStream, fileOS); 

Функция возвращает количество скопированных байтов. Если значение переменной i равно -1, это означает, что содержимое файла превышает 2 ГБ. Когда возвращаемое значение равно -1, вы можете использовать функцию copyLarge(inputStream, fileOS) вместо функции copy(inputstream, fileOS) для обработки этой нагрузки. Обе эти функции выполняют внутреннюю inputstream Внутренний буфер означает, что нам не нужно использовать BufferedInputStream для повышения производительности нашего кода и помогает нам избежать написания шаблонного кода.

Использование HTTP-компонентов Apache

Еще одна библиотека, управляемая организацией Apache, - это пакет HttpComponents. Эта библиотека использует механизм запроса-ответа для загрузки файла с заданного URL-адреса.

Первым шагом к загрузке файла является создание объекта HTTP-клиента, который будет отправлять запрос на сервер. Для этого мы будем использовать класс CloseableHttpClient Класс CloseableHttpClient - это абстрактный класс, HttpClientBuilder для создания экземпляров требуется класс HttpClientBuilder. Фрагмент кода, который создает новый HTTP-клиент, выглядит следующим образом:

 CloseableHttpClient client = HttpClientBuilder.create().build(); 

Затем нам нужно создать объект HttpGet или HttpPost для отправки запроса на сервер. Запрос создается следующей строкой кода:

 HttpGet request = new HttpGet("url from where the file is intended to be downloaded"); 

Функция execute(request) применяется к объекту клиента и возвращается с ответом от сервера. После отправки запроса на сервер нам понадобится объект ответа для получения данных, отправленных с сервера. Чтобы поймать ответ от сервера, мы используем объект класса HttpResponse

 HttpResponse response = client.execute(request); 

Данные, отправленные сервером в виде сообщения, получаются с помощью функции getEntity() .

 HttpEntity entity = response.getEntity(); 

Вы также можете получить код ответа, отправленный сервером через response и использовать его для своих конкретных нужд.

 int responseCode = response.getStatusLine().getStatusCode(); 

Загружаемые данные инкапсулируются в entity и могут быть извлечены с помощью функции getContent() . Функция getContent() возвращает InputStream который можно в дальнейшем использовать с BufferedInputStreamReader для повышения производительности.

 InputStream inputStream = entity.getContent(); 

Теперь все, что вам нужно сделать, это прочитать из потока побайтно и записать содержимое в файл с FileOutputStream класса FileOutputStream.

 String fileName = "D:\\Demo\file.txt"; 
 FileOutputStream fos = new FileOutputStream(filename); 
 Int byte; 
 while((byte = inputStream.read()) != -1) { 
 fos.write(byte); 
 } 

Последнее, что необходимо сделать, - это закрыть все открытые ресурсы, чтобы гарантировать, что системные ресурсы не используются чрезмерно и не будет утечек памяти.

Заключение

Вот и все - это простейшие способы загрузки файла с использованием базового кода Java и других сторонних библиотек. Теперь, когда мы закончили с основами, вы можете проявлять столько творчества, сколько хотите, и использовать полученные знания в соответствии со своими потребностями. Итак, увидимся в следующий раз с новым набором концепций, которые помогут вам стать лучшим программистом. Мы желаем вам удачного программирования до тех пор.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus