Java прочитать файл по url
Class URL represents a Uniform Resource Locator, a pointer to a "resource" on the World Wide Web. A resource can be something as simple as a file or a directory, or it can be a reference to a more complicated object, such as a query to a database or to a search engine. More information on the types of URLs and their formats can be found at: Types of URL
In general, a URL can be broken into several parts. Consider the following example:
The syntax of URL is defined by RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax, amended by RFC 2732: Format for Literal IPv6 Addresses in URLs. The Literal IPv6 address format also supports scope_ids. The syntax and usage of scope_ids is described here.
This fragment is not technically part of the URL. Rather, it indicates that after the specified resource is retrieved, the application is specifically interested in that part of the document that has the tag chapter1 attached to it. The meaning of a tag is resource specific.
An application can also specify a "relative URL", which contains only enough information to reach the resource relative to another URL. Relative URLs are frequently used within HTML pages. For example, if the contents of the URL:
The relative URL need not specify all the components of a URL. If the protocol, host name, or port number is missing, the value is inherited from the fully specified URL. The file component must be specified. The optional fragment is not inherited.
The URL class does not itself encode or decode any URL components according to the escaping mechanism defined in RFC2396. It is the responsibility of the caller to encode any fields, which need to be escaped prior to calling URL, and also to decode any escaped fields, that are returned from URL. Furthermore, because URL has no knowledge of URL escaping, it does not recognise equivalence between the encoded or decoded form of the same URL. For example, the two URLs:
would be considered not equal to each other.
Note, the URI class does perform escaping of its component fields in certain circumstances. The recommended way to manage the encoding and decoding of URLs is to use URI , and to convert between these two classes using toURI() and URI.toURL() .
The URLEncoder and URLDecoder classes can also be used, but only for HTML form encoding, which is not the same as the encoding scheme defined in RFC2396.
Reading from a URLConnection
The following program performs the same function as the URLReader program shown in Reading Directly from a URL.
However, rather than getting an input stream directly from the URL, this program explicitly retrieves a URLConnection object and gets an input stream from the connection. The connection is opened implicitly by calling getInputStream . Then, like URLReader , this program creates a BufferedReader on the input stream and reads from it. The bold statements highlight the differences between this example and the previous:
The output from this program is identical to the output from the program that opens a stream directly from the URL. You can use either way to read from a URL. However, reading from a URLConnection instead of reading directly from a URL might be more useful. This is because you can use the URLConnection object for other tasks (like writing to the URL) at the same time.
Again, if the program hangs or you see an error message, you may have to set the proxy host so that the program can find the Oracle server.
Methods inherited from class java.lang.Object
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Функция возвращает количество скопированных байтов. Если значение переменной i равно -1, то это указывает на то, что содержимое файла превышает 2 ГБ. Когда возвращаемое значение равно -1, вы можете использовать функцию copyLarge(входной поток, файлы) вместо функции copy(входной поток, файлы) для обработки этой нагрузки. Обе эти функции буферизуют входной поток внутри. Внутренний буфер означает, что нам не нужно использовать класс BufferedInputStream для повышения производительности нашего кода, и помогает нам избежать написания шаблонного кода.
Вы также можете получить код ответа, отправленный сервером через объект response , и использовать его в соответствии с вашими конкретными потребностями.
Загружаемые данные инкапсулируются в объект entity и могут быть извлечены с помощью функции getContent () . Функция getContent() возвращает объект InputStream , который в дальнейшем может использоваться с устройством чтения BufferedInputStream для повышения производительности.
Теперь все, что вам нужно сделать, это прочитать из потока байт за байтом и записать содержимое в файл с помощью класса FileOutputStream .
Последнее, что требуется сделать, – это закрыть все открытые ресурсы, чтобы убедиться, что системные ресурсы не используются чрезмерно и что нет утечек памяти.
5. Получите все файлы из папки ресурсов. (Версия JAR)
5.1 В этом примере показано, как Файлы.перейдите в папку внутри файла JAR через Файловые системы и URI jar:файл: xxx.jar .
4.2. Apache Commons IO
Другой широко используемой библиотекой для операций ввода-вывода является Apache Commons IO . Из Javadoc мы видим, что существует служебный класс с именем FileUtils , который используется для общих задач обработки файлов.
Чтобы загрузить файл с URL-адреса, мы можем использовать этот однострочный:
С точки зрения производительности этот код такой же, как и тот, который мы проиллюстрировали в разделе 2.
Базовый код использует те же концепции чтения в цикле некоторых байтов из InputStream и записи их в OutputStream .
Одно из отличий заключается в том, что здесь класс URLConnection используется для управления тайм-аутами подключения, чтобы загрузка не блокировалась в течение большого количества времени:
4. Получите все файлы из папки ресурсов. (Среда, ОТЛИЧНАЯ от JAR)
Если мы не знаем точного имени файла и хотим прочитать все файлы, включая файлы вложенных папок из папки ресурсов, мы можем использовать NIO Файлы.перейдите , чтобы легко получить доступ к файлам и прочитать их.
4.1 В приведенном ниже примере используются Файлы.пройдите чтобы прочитать все файлы из папки src/основные/ресурсы/json :
4.2 Однако стандартные Файлы.прогулка в примере 4.1 не удается получить доступ к файлам в файле JAR напрямую, попробуйте запустить пример 4.1 в среде JAR, и он выдает Исключение FileSystemNotFoundException .
1. Файлы в ресурсах папка
1.1 Просмотрите файлы в src/main/ресурсы , позже мы получим доступ к файлам и распечатаем содержимое файла.
1.2 По умолчанию инструменты сборки, такие как Maven, Gradle или обычная практика Java, будут копировать все файлы из src/основные/ресурсы в корневой каталог целевые/классы или сборка/классы . Итак, когда мы пытаемся прочитать файл из src/main/ресурсы , мы читаем файл из корневого каталога пути к классам проекта.
1.3 Ниже приведена структура файла JAR. Обычно файлы в папке ресурсы копируются в корневой каталог пути к классу.
Method Summary
Modifier and Type | Method and Description |
---|---|
boolean | equals (Object obj) |
Returns a URLConnection instance that represents a connection to the remote object referred to by the URL .
Same as openConnection() , except that the connection will be made through the specified proxy; Protocol handlers that do not support proxing will ignore the proxy parameter and make a normal connection.
Constructor Summary
6. Заключение
В этой статье мы рассмотрели несколько способов загрузки файла с URL-адреса на Java.
Наиболее распространенной реализацией является та, в которой мы буферизуем байты при выполнении операций чтения/записи. Эта реализация безопасна для использования даже для больших файлов, потому что мы не загружаем весь файл в память.
Мы также видели, как мы можем реализовать загрузку с нулевой копией с помощью Java NIO Channels . Это полезно, поскольку сводит к минимуму количество переключений контекста, выполняемых при чтении и записи байтов, а при использовании прямых буферов байты не загружаются в память приложения.
В этой статье будет показано, как прочитать файл из папки “ресурсы”, “getResourceAsStream” или “getResource”.
Автор оригинала: mkyong.
В Java мы можем использовать getResourceAsStream или getResource для чтения файла или нескольких файлов из папки ресурсы или корневого каталога пути к классу.
Метод getResource возвращает URL и обычно преобразует его в Файл ; Не работает в файле JAR .
2. Получите файл из папки ресурсов.
2.1 Приведенный ниже пример демонстрирует использование getResourceAsStream и getResource методы чтения файла json/файл 1.json из папки ресурсы
- Метод getResource не работает в файле JAR.
- Метод getResourceAsStream работает везде.
2.2 Теперь мы упаковываем проект в файл JAR и запускаем его; на этот раз getResource завершится ошибкой и вернет либо Исключение NoSuchFileException , либо Исключение InvalidPathException . Мы не можем прочитать файлы внутри файла JAR по URL-адресу ресурса.
Запустите файл JAR в Linux (Ubuntu), он вызовет Исключение NoSuchFileException .
Запустите файл JAR в Windows, он вызовет Исключение InvalidPathException .
P.S В этом примере используется плагин Maven maven-jar-плагин чтобы создать файл JAR.
3. Получите файл из папки ресурсов – Модульный тест
3.1 Мы помещаем тестовые ресурсы в папку src/test/ресурсы для модульных тестов. Обычно файлы в тестовых ресурсах копируются в папку target/test-classes .
3.2 Это работает так же, как мы читаем файл из src/main/ресурсы . Мы используем то же самое getResourceAsStream и getResource методы чтения файла из src/test/ресурсов .
Apache Commons IO
Библиотека Apache Commons IO предлагает список служебных классов для управления операциями ввода-вывода. Теперь вы, возможно, думаете, зачем нам это использовать, когда Java имеет свой собственный набор библиотек для обработки операций ввода-вывода. Однако Apache Commons IO решает проблему перезаписи кода и помогает избежать написания шаблонного кода.
Чтобы начать использовать библиотеку ввода-вывода Apache Commons, вам нужно будет загрузить файлы jar с официального сайта . Когда вы закончите загрузку файлов jar, вам нужно добавить их, чтобы использовать их. Если вы используете интегрированную среду разработки (IDE), такую как Eclipse , вам нужно будет добавить файлы в путь сборки вашего проекта. Чтобы добавить файлы в свой проект, вам нужно будет щелкнуть по нему правой кнопкой мыши, выбрать параметр путь к сборке, перейдя через “настроить путь к сборке-> путь к сборке”, а затем выбрать опцию добавить внешние архивы.
Чтобы загрузить файл с заданного URL-адреса с помощью ввода-вывода Apache Commons, нам потребуется класс FileUtils пакета. Для загрузки файла требуется всего одна строка кода, которая выглядит следующим образом:
Тайм-ауты подключения и чтения указывают допустимое время, в течение которого соединение может оставаться в режиме ожидания или чтение с URL-адреса может прекратиться.
Другим классом пакета ввода-вывода Apache Commons, который можно использовать для загрузки файла через Интернет, является класс IOUtils . Мы будем использовать метод copy(входной поток, файловая ОС) для загрузки файла в локальную систему.
5. Возобновляемая Загрузка
Учитывая, что интернет-соединения время от времени выходят из строя, нам полезно иметь возможность возобновить загрузку, а не загружать файл снова с нулевого байта.
Давайте перепишем первый пример из предыдущих, чтобы добавить эту функциональность.
Теперь, когда у нас есть общий размер содержимого файла, мы можем проверить, частично ли загружен наш файл. Если это так, мы возобновим загрузку с последнего байта, записанного на диске:
Здесь происходит то, что мы настроили URLConnection для запроса байтов файла в определенном диапазоне . Диапазон будет начинаться с последнего загруженного байта и заканчиваться на байте, соответствующем размеру удаленного файла.
Другим распространенным способом использования заголовка Range является загрузка файла по частям путем установки различных диапазонов байтов. Например, для загрузки файла размером 2 КБ мы можем использовать диапазон 0 – 1024 и 1024 – 2048.
Еще одно тонкое отличие от кода в разделе 2. заключается в том, что FileOutputStream открывается с параметром append , установленным в true :
После того, как мы внесли это изменение, остальная часть кода идентична той, которую мы видели в разделе 2.
Constructor Summary
Java IO
Наиболее доступным и базовым пакетом, доступным для загрузки файла из Интернета с использованием кода Java, является пакет Java IO . Здесь мы будем использовать BufferedInputStream и классы URL для открытия и чтения файла по заданному адресу в файл в нашей локальной системе. Причина, по которой мы используем класс BufferedInputStream вместо InputStream , заключается в его способности буферизации, которая повышает производительность нашего кода.
Прежде чем мы углубимся в аспект кодирования, давайте рассмотрим классы и отдельные функции, которые мы будем использовать в процессе.
Функция openStream() работает с объектом класса URL|/. Класс URL открывает соединение с заданным URL, а метод openStream() возвращает входной поток, который используется для чтения данных из соединения.
Второй класс, который мы будем использовать, – это BufferedInputStream Reader и FileOutputStream . Эти классы используются для чтения из файла и записи в него соответственно.
Как вы можете видеть, мы открываем соединение с помощью объекта URL , а затем считываем его через BufferedInputStream Reader объект. Содержимое считывается в байтах и копируется в файл в локальном каталоге с помощью FileOutputStream .
Чтобы уменьшить количество строк кода, мы можем использовать класс Files , доступный в Java 7. Класс Files содержит методы, которые считывают все байты сразу, а затем копируют их в другой файл. Вот как вы можете его использовать:
Java NIO
Java NIO-это альтернативный пакет для обработки сетевых операций и операций ввода-вывода на Java. Основное преимущество, которое предлагает пакет Java NIO , заключается в том, что он не блокируется и обладает возможностями передачи и буферизации. Когда мы используем библиотеку ввода-вывода Java, мы работаем с потоками, которые байт за байтом считывают данные. Однако пакет Java NIO использует каналы и буферы. Возможности буферизации и передачи позволяют системе копировать содержимое с URL-адреса непосредственно в нужный файл без необходимости сохранения байтов в памяти приложения, что было бы промежуточным шагом. Возможность работы с каналами повышает производительность.
Для загрузки содержимого URL-адреса мы будем использовать классы ReadableByteChannel и FileChannel .
Класс ReadableByteChannel создает поток для чтения содержимого с URL-адреса. Загруженное содержимое будет передано в файл в локальной системе через соответствующий файловый канал.
После определения канала файла мы будем использовать метод transferFrom() для копирования содержимого, считанного с объекта канала чтения , в место назначения файла с помощью объекта writeChannel .
Методы передача из() и передача в() намного эффективнее, чем работа с потоками с использованием буфера. Методы передачи позволяют нам напрямую копировать содержимое кэша файловой системы в файл в системе. Таким образом, прямое каналирование ограничивает количество требуемых переключений контекста и повышает общую производительность кода.
Теперь в следующих разделах мы рассмотрим способы загрузки файлов с URL-адреса с использованием сторонних библиотек вместо основных функциональных компонентов Java.
4. Использование Библиотек
В приведенных выше примерах мы видели, как мы можем загружать контент с URL-адреса, просто используя функциональность ядра Java. Мы также можем использовать функциональность существующих библиотек, чтобы облегчить нашу работу, когда настройки производительности не нужны.
Например, в реальном сценарии нам нужно, чтобы наш код загрузки был асинхронным.
Мы могли бы обернуть всю логику в Вызываемый , или мы могли бы использовать для этого существующую библиотеку.
Загруженный контент будет помещен в FileOutputStream :
Bytebuffer преимущество заключается в том, что память выделяется за пределами кучи JVM, поэтому она не влияет на память приложений.
3. Использование NIO
Пакет Java NIO предлагает возможность передачи байтов между 2 каналами без буферизации их в память приложения.
Чтобы прочитать файл с нашего URL-адреса, мы создадим новый ReadableByteChannel из URL потока:
Байты, считанные из ReadableByteChannel , будут переданы в FileChannel , соответствующий файлу, который будет загружен:
Мы будем использовать метод transferFrom() из класса ReadableByteChannel для загрузки байтов с заданного URL-адреса в наш файловый канал :
Методы transferTo() и transferFrom() более эффективны, чем простое чтение из потока с использованием буфера. В зависимости от базовой операционной системы, данные могут быть переданы непосредственно из кэша файловой системы в наш файл без копирования каких-либо байтов в память приложения .
В системах Linux и UNIX эти методы используют нулевая копия метод, который уменьшает количество переключений контекста между режимом ядра и пользовательским режимом.
Writing to a URLConnection
Many HTML pages contain forms — text fields and other GUI objects that let you enter data to send to the server. After you type in the required information and initiate the query by clicking a button, your Web browser writes the data to the URL over the network. At the other end the server receives the data, processes it, and then sends you a response, usually in the form of a new HTML page.
For a Java program to interact with a server-side process it simply must be able to write to a URL, thus providing data to the server. It can do this by following these steps:
- Create a URL .
- Retrieve the URLConnection object.
- Set output capability on the URLConnection .
- Open a connection to the resource.
- Get an output stream from the connection.
- Write to the output stream.
- Close the output stream.
Here is a small servlet named ReverseServlet (or if you prefer a cgi-bin script). You can use this servlet to test the following example program.
The servlet running in a container reads from its InputStream, reverses the string, and writes it to its OutputStream. The servlet requires input of the form string=string_to_reverse , where string_to_reverse is the string whose characters you want displayed in reverse order.
Here's an example program that runs the ReverseServlet over the network through a URLConnection :
Let's examine the program and see how it works. First, the program processes its command-line arguments:
These statements ensure that the user provides two and only two command-line arguments to the program. The command-line arguments are the location of the ReverseServlet and the string that will be reversed. It may contain spaces or other non-alphanumeric characters. These characters must be encoded because the string is processed on its way to the server. The URLEncoder class methods encode the characters.
Next, the program creates the URL object, and sets the connection so that it can write to it:
The program then creates an output stream on the connection and opens an OutputStreamWriter on it:
If the URL does not support output, getOutputStream method throws an UnknownServiceException . If the URL does support output, then this method returns an output stream that is connected to the input stream of the URL on the server side — the client's output is the server's input.
Next, the program writes the required information to the output stream and closes the stream:
as the argument (including the double quote marks), you should see this output:
2. Использование Java IO
Самый простой API, который мы можем использовать для загрузки файла, – это Java IO . Мы можем использовать класс URL , чтобы открыть соединение с файлом, который мы хотим загрузить. Чтобы эффективно прочитать файл, мы будем использовать метод openStream() для получения InputStream:
Увеличение производительности происходит за счет буферизации. При чтении одного байта за раз с помощью метода read() каждый вызов метода подразумевает системный вызов базовой файловой системы. Когда JVM вызывает системный вызов read () , контекст выполнения программы переключается из пользовательского режима в режим ядра и обратно.
Это переключение контекста дорого с точки зрения производительности. Когда мы читаем большое количество байтов, производительность приложения будет низкой из-за большого количества переключений контекста.
Для записи байтов, считанных с URL-адреса, в ваш локальный файл мы будем использовать метод write() из класса FileOutputStream :
При использовании BufferedInputStream метод read() будет считывать столько байтов, сколько мы задали для размера буфера. В нашем примере мы уже делаем это, читая блоки по 1024 байта за раз, поэтому BufferedInputStream не нужен.
Приведенный выше пример очень многословен, но, к счастью, начиная с Java 7, у нас есть класс Files , который содержит вспомогательные методы для обработки операций ввода-вывода. Мы можем использовать метод Files.copy () , чтобы прочитать все байты из InputStream и скопировать их в локальный файл:
Наш код работает хорошо, но может быть улучшен. Его основным недостатком является то, что байты буферизуются в памяти.
К счастью, Java предлагает нам пакет NIO, который имеет методы для передачи байтов непосредственно между 2 каналами без буферизации.
Мы подробно рассмотрим это в следующем разделе.
Constructor Detail
host can be expressed as a host name or a literal IP address. If IPv6 literal address is used, it should be enclosed in square brackets ( '[' and ']' ), as specified by RFC 2732; However, the literal IPv6 address format defined in RFC 2373: IP Version 6 Addressing Architecture is also accepted.
Specifying a port number of -1 indicates that the URL should use the default port for the protocol.
- If the application has previously set up an instance of URLStreamHandlerFactory as the stream handler factory, then the createURLStreamHandler method of that instance is called with the protocol string as an argument to create the stream protocol handler.
- If no URLStreamHandlerFactory has yet been set up, or if the factory's createURLStreamHandler method returns null , then the constructor finds the value of the system property:
If the value of that system property is not null , it is interpreted as a list of packages separated by a vertical slash character ' | '. The constructor tries to load the class named:
Protocol handlers for the following protocols are guaranteed to exist on the search path :-
No validation of the inputs is performed by this constructor.
Creates a URL from the specified protocol name, host name, and file name. The default port for the specified protocol is used.
This method is equivalent to calling the four-argument constructor with the arguments being protocol , host , -1 , and file . No validation of the inputs is performed by this constructor.
If the handler is not null and there is a security manager, the security manager's checkPermission method is called with a NetPermission("specifyStreamHandler") permission. This may result in a SecurityException. No validation of the inputs is performed by this constructor.
This constructor is equivalent to a call to the two-argument constructor with a null first argument.
Creates a URL by parsing the given spec within a specified context. The new URL is created from the given context URL and the spec argument as described in RFC2396 "Uniform Resource Identifiers : Generic * Syntax" :
The reference is parsed into the scheme, authority, path, query and fragment parts. If the path component is empty and the scheme, authority, and query components are undefined, then the new URL is a reference to the current document. Otherwise, the fragment and query parts present in the spec are used in the new URL.
If the scheme component is defined in the given spec and does not match the scheme of the context, then the new URL is created as an absolute URL based on the spec alone. Otherwise the scheme component is inherited from the context URL.
If the authority component is present in the spec then the spec is treated as absolute and the spec authority and path will replace the context authority and path. If the authority component is absent in the spec then the authority of the new URL will be inherited from the context.
If the spec's path component begins with a slash character "/" then the path is treated as absolute and the spec path replaces the context path.
Otherwise, the path is treated as a relative path and is appended to the context path, as described in RFC2396. Also, in this case, the path is canonicalized through the removal of directory changes made by occurrences of ".." and ".".
For a more detailed description of URL parsing, refer to RFC2396.
Creates a URL by parsing the given spec with the specified handler within a specified context. If the handler is null, the parsing occurs as with the two argument constructor.
Вы хотите создать свой собственный набор данных для нового и инновационного приложения? Или, может быть, вы пытаетесь собрать данные для анализа для проекта колледжа и устали вручную загружать каждое изображение или файл CSV. Не волнуйтесь, в этой статье я объясню строительные блоки, необходимые для автоматизации загрузки файлов для выполнения подобных задач.
Прежде чем вы сможете создать приложение для загрузки и создания наборов данных для себя, вам необходимо знать основы, необходимые для автоматизации загрузки файлов с помощью кода Java. Правильное понимание основ поможет вам использовать их в соответствии с вашими конкретными потребностями, будь то для серверного приложения или приложения для Android.
Существует несколько способов загрузки файла с помощью кода Java. Вот лишь несколько способов, как вы можете выполнить эту задачу:
Вывод
Итак, вот оно что – это самые простые способы загрузки файла с использованием базового кода Java и других сторонних библиотек. Теперь, когда мы закончили с основами, вы можете быть настолько творческими, насколько захотите, и использовать полученные знания в соответствии с вашими потребностями. Так что увидимся в следующий раз с новым набором концепций, которые помогут вам стать лучшим программистом. Мы желаем вам счастливого кодирования до тех пор.
В этом уроке мы рассмотрим несколько методов, которые можно использовать для загрузки файла.
Наконец, мы поговорим о том, как мы можем возобновить загрузку, если наше соединение не удастся до того, как весь файл будет прочитан.
Читайте также: