Как получить имя файла по url java

Обновлено: 06.07.2024

ОТВЕТЫ

Ответ 1

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

Проверьте больше об этом здесь.

Примечание. Третий параметр в TransferFrom - это максимальное количество байтов для передачи. Integer.MAX_VALUE будет передавать не более 2 ^ 31 байта, Long.MAX_VALUE не более 2 ^ 63 байта (больше, чем любой существующий файл).

Ответ 2

Используйте apache commons-io, только один код строки:

Ответ 3

Упрощение использования nio:

Ответ 4

Вам нужно обработать исключения, возможно, внешние для этого метода.

Ответ 5

Загрузка файла требует, чтобы вы его прочитали, в любом случае вам придется каким-то образом пройти через файл. Вместо строки за строкой вы можете просто прочитать ее байтами из потока:

Ответ 6

Это старый вопрос, но вот краткое, удобочитаемое решение только для JDK с правильно закрытыми ресурсами:

Две строки кода и никаких зависимостей.

Ответ 7

При использовании Java 7+ используйте следующий метод, чтобы загрузить файл из Интернета и сохранить его в каком-либо каталоге:

Ответ 8

Этот ответ почти точно подобен выбранному ответу, но с двумя улучшениями: это метод и он закрывает объект FileOutputStream:

Ответ 9

Ответ 10

Ответ 11

Это еще один вариант java7, основанный на ответе Брайана Риск с использованием инструкции try-with:

Ответ 12

Здесь метод, который не генерирует исключения для сетевых ошибок (только для действительно исключительных проблем, таких как неверный URL-адрес или проблемы с записью в файл)

Ответ 13

Существует проблема с простым использованием:

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

Ответ 14

В отличие от одной строки кода:

этот код даст вам больше контроля над процессом и позволит указать не только тайм-ауты, но User-Agent и Referer значения, которые имеют решающее значение для многих веб-сайтов.

Ответ 15

В библиотеке underscore-java есть метод U.fetch(url).

Ответ 16

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

(Помечается как wiki сообщества, не стесняйтесь добавлять информацию или исправления)

Ответ 17

Ответ 18

Вы можете сделать это в 1 строке, используя netloader для Java:

Ответ 19

Если вы находитесь за прокси-сервером, вы можете установить прокси-серверы в java-программе, как показано ниже:

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

Ответ 20

Ниже приведен пример кода для загрузки фильма из Интернета с использованием кода Java:

Работу с потоками ввода-вывода мы уже изучили, работу с файлами изучили, что же изучить дальше? А как насчет работы с сетью и интернетом? Звучит многообещающе, не так ли?

В Java работать с интернетом не сложнее, чем работать с файлами. Ну разве что совсем чуть-чуть.

Для работы с ресурсами в интернете в Java есть специальный класс — URL . Он простой, как табуретка, в чем вы сейчас и убедитесь.

Получение странички из интернета

Как вы думаете, сколько строк кода нужно написать, чтобы скачать какой-нибудь текстовый файл из интернета и отобразить его содержимое на экране? 10? 100? 1000? А может быть, 5?

Код Примечание
Создает объект URL с путем к странице
Получает InputStream у интернет-объекта
Читает все байты и возвращает массив байт
Преобразуем массив в строку
Выводим строку на экран

На экране отобразится содержимое HTML-файла:

Вывод на экран

Напиши код, который будет считывать с клавиатуры ссылку на файл в интернете, скачивать его и сохранять во временный файл. Используй методы createTempFile(null, null) и write(Path, byte[]) класса Files, а также метод openStream() класса URL.

2. Класс URLConnection

Кроме простого чтения данных из интернета, мы еще можем и загружать туда данные. Загрузка данных — это куда более сложный процесс, чем считывание. Вам понадобится на несколько методов больше. Пример:


Получаем поток вывода
Выводим в него данные

Обратите внимание, что тут мы больше не вызываем метод url.openStream() . Вместо этого мы идем по более длинному пути:

  • Сначала мы устанавливаем стабильное двустороннее соединение с помощью метода URLConnection openConnection()
  • Затем получаем поток для отправки данных с помощью метода connection.getOutputStream() и отправляем данные серверу
  • Затем получаем поток для чтения данных с помощью метода connection.getInputStream() и начинаем читать из него данные.

Контроль ресурсов

Строго говоря, мы должны все потоки обернуть в try -with-resources для безопасной работы. А еще не помешало бы обернуть голые InputStream и OutputStream во что-нибудь более удобное. Например, в PrintStream и BufferedReader .

Если мы все это сделаем, наш код будет выглядеть как-то так:

3. Примеры работы с сетью

А давай-ка мы что-нибудь загрузим из интернета. И не просто загрузим, а сохраним на диск.

Например, давайте напишем программу, которая сохраняет на диск картинку с главной страницы Google.

В принципе ничего сложного. В самой простой интерпретации этот код будет выглядеть так:

Сохранение файла на диск

С помощью трех первых строк мы получаем поток данных от интернет-ресурса — от картинки.

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

Ну и наконец, последняя строка — это один из методов copy класса Files . У класса Files их несколько. Этот метод, который мы использовали, принимает в качестве первого параметра источник данных — байтовый поток ( InputStream ), а в качестве второго параметра — имя файла, куда нужно записывать данные.

Теоретически, если бы URL картинки был коротким, этот код вообще можно было бы записать в одну строку:

Копирование данных из потока в файл

Писать так, конечно же, не нужно , однако этот пример демонстрирует, насколько удобные и мощные в Java потоки ввода-вывода.

2. Создание URL-адреса

Мы только что создали абсолютный URL-объект . Адрес содержит все части, необходимые для достижения желаемого ресурса.

Мы также можем создать относительный URL-адрес ; предполагая, что у нас есть объект URL, представляющий домашнюю страницу Baeldung:

Затем давайте создадим новый URL-адрес, указывающий на ресурс, который мы уже знаем; мы собираемся использовать другой конструктор, который принимает как существующий URL-адрес, так и имя ресурса относительно этого URL-адреса:

Теперь мы создали новый объект URL url относительно home ; таким образом, относительный URL действителен только в контексте базового URL.

Мы можем увидеть это в тесте:

Однако если относительный URL-адрес обнаружен как абсолютный в его составных частях, то baseUrl игнорируется:

Наконец, мы можем создать URL-адрес, вызвав другой конструктор, который принимает составные части строки URL-адреса. Мы рассмотрим это в следующем разделе после того, как рассмотрим компоненты URL.

3. Компоненты URL

URL – адрес состоит из нескольких компонентов, которые мы рассмотрим в этом разделе.

Давайте сначала рассмотрим разделение между идентификатором протокола и ресурсом – эти два компонента разделяются двоеточием, за которым следуют две косые черты, т. е. ://.

Давайте посмотрим на API, который предоставляет объект URL .

3.1. Протокол

Для получения протокола – мы используем метод getProtocol() :

3.2. Порт

Чтобы получить порт – мы используем метод getPort() :

Обратите внимание, что этот метод извлекает явно определенный порт. Если порт не определен явно, он вернет значение -1.

Вот пример, где у нас есть явно определенный порт:

3.3. Хозяин

Мы вызываем метод getHost() для получения имени хоста:

3.4. Имя Файла

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

3.5. Параметры пути

Мы также можем проверять только путь параметры, которые в нашем случае являются /статьями :

3.6. Параметры запроса

Аналогично, мы можем проверить параметры запроса , которые являются topic=java&version=8 :

4. Создание URL-Адреса С Компонентами

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

Первый конструктор принимает протокол, имя хоста и имя файла соответственно:

Имейте в виду значение имени файла в этом контексте, следующий тест должен сделать его более ясным:

Второй конструктор принимает протокол, имя хоста, номер порта и имя файла соответственно:

5. Заключение

В этом уроке мы рассмотрели класс URL и показали, как использовать его в Java для программного доступа к сетевым ресурсам.

Как всегда, полный исходный код статьи и все фрагменты кода можно найти в проекте GitHub .

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

В этой статье мы создадим три небольших проекта:

  • Реализуем получение и обработку изображений, аудио, видео и текста в формате txt и pdf
  • Создадим генератор JSON-файлов
  • Напишем две программы: одна будет формировать вопросы (в формате JSON), а другая использовать их для создания теста

Получаем и обрабатываем файлы

Для начала создадим директорию, в которой будут храниться наши проекты. Назовем ее «Work-With-Files-in-JavaScript» или как Вам будет угодно.

В этой директории создадим папку для первого проекта. Назовем ее «File-Reader».

Создаем в ней файл «index.html» следующего содержания:


Здесь мы имеем контейнер-файлоприемник и инпут с типом «file» (для получения файла; мы будем работать с одиночными файлами; для получения нескольких файлов инпуту следует добавить атрибут «multiple»), который будет спрятан под контейнером.

Стили можно подключить отдельным файлом или в теге «style» внутри head:


Можете сделать дизайн по своему вкусу.

Не забываем подключить скрипт либо в head с атрибутом «defer» (нам нужно дождаться отрисовки (рендеринга) DOM; можно, конечно, сделать это в скрипте через обработку события «load» или «DOMContentLoaded» объекта «window», но defer намного короче), либо перед закрывающим тегом «body» (тогда не нужен ни атрибут, ни обработчик). Лично я предпочитаю первый вариант.

Откроем index.html в браузере:


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

Нам часто придется обращаться к объектам «document» и «document.body», а также несколько раз выводить результаты в консоль, поэтому предлагаю обернуть наш код в такое IIFE (это не обязательно):


Первым делом объявляем переменные для файлоприемника, инпута и файла (последний не инициализируем, поскольку его значение зависит от способа передачи — через клик по инпуту или бросание (drop) в файлоприемник):

Отключаем обработку событий «dragover» и «drop» браузером:


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

Обрабатываем бросание файла в файлоприемник:


Мы только что реализовали простейший механизм «dran'n'drop».

Обрабатываем клик по файлоприемнику (делегируем клик инпуту):


Приступаем к обработке файла:


Удаляем файлоприемник и инпут:


Способ обработки файла зависит от его типа:


Мы не будем работать с html, css и js-файлами, поэтому запрещаем их обработку:


Мы также не будем работать с MS-файлами (имеющими MIME-тип «application/msword», «application/vnd.ms-excel» и т.д.), поскольку их невозможно обработать нативными средствами. Все способы обработки таких файлов, предлагаемые на StackOverflow и других ресурсах, сводятся либо к конвертации в другие форматы с помощью различных библиотек, либо к использованию viewer'ов от Google и Microsoft, которые не хотят работать с файловой системой и localhost. Вместе с тем, тип pdf-файлов также начинается с «application», поэтому такие файлы мы будем обрабатывать отдельно:


Для остальных файлов получаем их «групповой» тип:


Посредством switch..case определяем конкретную функцию обработки файла:

Результат работы сохраненного этого кода в jar-файл FileName.jar выглядит так , а хотелось бы получить строку, содержащую .
.
Дирректория, из которой вызывается этот файл получается без проблем

Результат работы сохраненного этого кода в jar-файл FileName.jar выглядит так , а хотелось бы получить строку, содержащую .
.
Дирректория, из которой вызывается этот файл получается без проблем

А с учетом, что код не обязательно должен лежать на диске и не обязательно в JAR - зачем такой НЕ портируемый велосипед нужен.

Я не спрашиваю зачем тебе это надо. Ведь java процесс может начать бутстрап не только с jar но и с class файла
в фолдере среды разработки как это делают IDE для ускорения отладки. А может Graal или Excelsior вообще не заполняют
это свойство. Ведь их старт сильно отличается от классической JVM.

Имени JAR'ника все равно не достаточно. Ведь в нем может быть несколько классов c main методом. Потеряются параметры / настройки JVM переданные в командной строке (а они могут быть важны для корректной работы) и так далее.

Почему простой? Потому что надёжность его должна быть выше чем надежность твоего jar-ника.

В твоём-же варианте любое изменение jar-ника ставит под вопрос сам факт надёжности
механизма перезапуска.

Например я делал такой механизм для системы автоматического обновления софта в клиент-сервере

Скачивалась новая версия из СУБД * во временную папку, запускался "перезапускальшик", происходил выход из приложения, перезапускальшик проверял, что приложение полностью закрыто (на выход из приложения тоже требуется время) и копировал файлы приложения, запускал новую версию приложения

Но ничего определять мне не требовалось. Т.к. имя своей собственной программы я и так знал ))) /да и файлов там было значительно больше одного/

Но здесь надо знать детали. Потому-что проблема которую я описал
приводик к потенциальной невозможности перезапустить приложение Сергея
самому приложению.

Дык kubernetes как раз и предназначен, чтобы быстро поднять, то что "упало" :-)
Правда, возможно для ТС это будет оверхэд.
Вполне возможно достаточно правильно настроить unit в Systemd для приложения.

[img=Screen Shot 2020-06-16 at 9.22.39 PM.jpg]

.
Возвращаясь к вопросу "Зачем", именно за тем, как ответил в первый раз. А делать выводы об осмысленности такого предназначения равно популярному ответу несведущих "поищи в интернете". Но это так, для того, чтобы улыбнулись. Я Вам все равно благодарен. И опубликовал новый вопрос в новой теме (Как измененить отображаемое имя основного класса Jar file). Сможете помочь?

Читайте также: