В чем разница между ресурсом, URI, URL, путем и файлом в Java?



Я смотрю на кусок кода Java прямо сейчас, и он принимает путь в виде строки и получает свой URL-адрес с помощью URL resource = ClassLoader.getSystemClassLoader().getResource(pathAsString);, затем звонки String path = resource.getPath() и, наконец, выполняется new File(path);.



О, и есть также звонки URL url = resource.toURI(); и String file = resource.getFile().



Я в полной растерянности сейчас - в основном из-за терминологии, я думаю. Может ли кто-нибудь, пожалуйста, провести меня через различия или предоставить несколько ссылок на фиктивный материал? Особенно URI для URL и ресурс Файл? Мне кажется, что они должны быть одинаковыми, соответственно...



разницу между getFile() и getPath() объясняется здесь: в чем разница между url.getFile () и getpath ()? (Интересно, что они оба, похоже, возвращают строки, что, вероятно, добавляет много к моему состоянию ума...)



теперь, если у меня есть локатор, который ссылается на класс или пакет в файле jar, будут ли эти два (т. е. путь к файлу строки) отличаются?



resource.toString() даст вам jar:file:/C:/path/to/my.jar!/com/example/, в конце концов (обратите внимание на восклицательный знак).



разница между URI и URLв Java что первый не кодирует пробелы? Ср. Файлы, URI и URL-адреса конфликтуют в Java (этот ответ объясняет общие, концептуальные разница между двумя терминами довольно хорошо: URI идентифицируют и URL-адреса находят;)



наконец - и самое главное - зачем мне это нужно File объект; почему не ресурс (URL) достаточно? (а есть ли ресурсный объект?)



Извините, если этот вопрос немного неорганизован; он просто отражает путаницу, которую я имею... :)

977   5  

5 ответов:

обновление 2017-04-12 Регистрация ответ JvR поскольку он содержит более исчерпывающее и точное объяснение!


обратите внимание, что я не считаю себя на 100% компетентным ответить, но тем не менее вот некоторые комментарии:

  • File представляет файл или каталог, доступный через файловую систему
  • ресурс это общий термин для объекта данных, который может быть загружен приложение
    • обычно ресурсы файлы, распространяемые с приложением / библиотекой и загружаемые через механизм загрузки классов (когда они находятся на пути к классу)
  • URL#getPath является геттер на пути часть URL (protocol://host/path?query)
  • URL#getFile согласно JavaDoc возвращает path+query

В Java, URI - это просто структура данных для управления самим универсальным идентификатором.

URL с другой стороны, это действительно локатор ресурсов и предлагает вам функции для фактического чтения ресурса через registered URLStreamHandler s.

URL-адреса могут привести к ресурсам файловой системы, и вы можете построить URL-адрес для каждого ресурса файловой системы с помощью file:// протокол (отсюда File URL связи).

также имейте в виду, что это URL#getFile не относится к java.io.File.


зачем мне нужен объект File; почему это не ресурс (URL) достаточно?

этого достаточно. Только если вы хотите передать ресурс в какой-то компонент, который может работать только с файлами, вам нужно получить File от него. Однако не все URL-адреса ресурсов могут быть преобразованы в File s.

а есть ли ресурсный объект?

С точки зрения JRE, это просто термин. Некоторые фреймворки предоставляют вам такой класс (например пружины ресурс).

Я в полной растерянности сейчас - в основном из-за терминологии, я думаю. Может ли кто-нибудь, пожалуйста, провести меня через различия или предоставить несколько ссылок на фиктивный материал? Особенно Ури адреса и ресурс в файл? Мне кажется, что они должны быть одинаковыми, соответственно...

терминология сбивает с толку и иногда сбивает с толку, и в основном рождается из эволюции Java как API и как платформы с течением времени. Чтобы понять, как эти термины стали означать то, что они делают, важно признать две вещи, которые влияют на дизайн Java:

  • совместимость. старые приложения должны работать на новых установках, в идеале без изменений. Это означает, что старый API (с его именами и терминологией) должен поддерживаться во всех новых версиях.
  • кросс-платформенный. API должен обеспечить полезную абстракцию его основы платформы, будь то операционная система или браузер.

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

что такое "ресурс"?

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

потому что одна из ранних целей дизайна Java должна была запускаться внутри браузера, как изолированное приложение (апплеты!) с очень ограниченными правами/привилегиями / допуском безопасности,Java делает четкое (теоретическое) различие между файлом (что-то в локальной файловой системе) и a ресурс (то, что ему нужно прочитать). вот почему чтение чего-то относительно приложения (значки, файлы классов и т. д.) выполняется через ClassLoader.getResource и не через класс File.

к сожалению, потому что "ресурс" также является полезным общим термином за пределами из этой интерпретации он также используется для обозначения очень конкретных вещей (например, class ResourceBundle,UIResource,ресурс), что не в этом смысл, ресурс.

основными классами, представляющими (путь к) ресурсу являются java.НИО.файл.Путь, Ява.Ио.Файл, Ява.чистая.Ури и Ява.чистая.URL-адрес.

File (java.io, 1.0)

абстрактное представление путей к файлам и каталогам.

класс File представляет собой ресурс, который доступно через родной платформы файловая система. Он содержит только имя файла, поэтому на самом деле это скорее путь (см. ниже), который платформа хоста интерпретирует в соответствии со своими собственными настройками, правилами и синтаксисом.

обратите внимание, что файл не должен указывать на что-то местные, просто что-то, что хост-платформа понимает в контексте доступа к файлам, например UNC-путь в Windows. Если вы монтируете ZIP-файл в качестве файловой системы в своей ОС, то файл будет читать содержащиеся в нем записи просто штраф.

URL (java.net, 1.0)

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

в сочетании с концепцией ресурса URL-адрес представляет этот ресурс так же, как класс File представляет файл на хост-платформе: as структурированная строка, указывающая на ресурс. URL дополнительно содержит схему, которая намекает на то, как добраться до ресурса (с "file:" being "ask the host platform"), и поэтому позволяет указывать на ресурсы через HTTP, FTP, внутри JAR и еще много чего.

к сожалению, URL-адреса имеют свой собственный синтаксис и терминологию, включая использование "file" и "path". В случае, если URL-адрес является URL-адрес, URL-адрес.метод getfile будет возвращать строку идентично строке пути файла, на который ссылается ссылка.

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

URI (java.net, 1.4)

представляет собой ссылку на единый идентификатор ресурса (URI).

URI-это (небольшая) абстракция по URL. разница между URI и URL является концептуальной и в основном академический, но URI лучше определен в формальном смысле и охватывает более широкий спектр вариантов использования. Поскольку URL и URI-это/не одно и то же, для их представления был введен новый класс с методами URI.toURL и URL.тури, чтобы двигаться между одним и другим.

в Java основное различие между URL и URI заключается в том, что URL-адрес несет в себе ожидание разрешимости, что-то приложение может хотеть InputStream от; URI обрабатывается больше как абстрактная вещь, которая может указать на что-то разрешимое (и обычно делает), но что это значит и как его достичь, более открыты для контекста и интерпретации.

путь (java.НИО.файл, 1.7)

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

новый файл API, обозначенный в интерфейсе пути, позволяет гораздо больше гибкость, чем может предложить класс File. Интерфейс пути-это абстракция класса файла, и является частью новый IO файл API. Где файл обязательно указывает на "файл", как это понимается платформой хоста, путь является более общим: it представляет файл (ресурс) в произвольные файловой системы.

путь убирает зависимость от концепции хост-платформы файла. Это может быть запись в ZIP-файле, файл, доступный через FTP или SSH-FS, многокорневое представление пути к классу приложения или действительно все, что может быть значимо представлено через интерфейс файловой системы и его драйвер, FileSystemProvider. Это приносит силу "монтажа" файловых систем в контексте приложения Java.

платформа хоста представлена через "файловую систему по умолчанию"; при вызове File.toPath, вы получаете путь к файловой системе по умолчанию.


теперь, если у меня есть локатор, который ссылается на класс или пакет в файле jar, будут ли эти две (т. е. путь к строкам файла) отличаться?

вряд ли. Если файл jar находится в локальной файловой системе, у вас не должно быть компонента запроса, поэтому URL.getPath и URL.getFile должен вернуть тот же результат. Однако выберите тот, который вам нужен: file-url обычно не имеют компонентов запроса, но я мог бы добавить его в любом случае.

наконец - и самое главное - почему я нужен объект File; почему недостаточно ресурса (URL)?

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

вам не нужен файл, если у вас есть доступ к пути. Однако для некоторых старых API может потребоваться файл.

(а есть ли ресурсный объект?)

нет, нет. Есть много вещей, которые им нравится, но они не являются ресурсом, в смысле ClassLoader.getResource.

ответ Павла хорала приятно.

как он говорит, слово "файл" имеет совершенно разные (практически не связанных) смыслов в URL#getFile vs java.io.File - может быть, это отчасти заблуждение.

добавляем:

  • A ресурс в Java это абстрактное понятие, источник данных, которые могут быть прочитаны. Расположение (или адрес) ресурса представлено в Java с помощью URL объект.

  • A ресурс может соответствовать обычному файлу в локальной файловой системе (в частности, при его URL начинается с file://). Но ресурс является более общим (это может быть также некоторый файл, хранящийся в банке, или некоторые данные для чтения из сети, или из памяти, или...). И это также более ограничено, потому что File (помимо того, что другие вещи, чем обычный файл: каталог, ссылка) также могут быть созданы и записаны к.

  • помните в Java a File "объект" не представляет "файл", но расположение (полное имя, с путем) файла. Так,

Как я понимаю, можно классифицировать их следующим образом:

Web-Based: URI и URL.

  • url: URL-это определенное место в интернете (просто обычный веб-адрес, например - stackoverflow.com)
  • URIs: Ever URL-это URI. Но URIs также может содержать такие вещи, как" mailto:", так что они также, Ну некоторые из" сценария " я бы сказал.

и локальный: ресурс, путь и файлы

  • Ресурсов: Ресурсы есть файлы внутри вашей банки. Они используются для загрузки файлов из банок / контейнеров.
  • путь: путь-это в основном строка. Но он поставляется с некоторыми удобными функциями для объединения нескольких строк или добавления файлов в строку. Это гарантирует, что путь, который вы строите, действителен.
  • File: это ссылка на каталог или файл. Он используется для редактирования файлов, открывать их и т. д.

было бы проще, если бы они были объединены в один класс-они действительно путаешь :Д

Я надеюсь, что это поможет вам :)

(Я просто взглянул на документацию-посмотрите docs.oracle.com)

файл-это абстрактное представление сущности в локальной файловой системе.

путь обычно представляет собой строку, указывающую расположение файла в файловой системе. Обычно он не включает имя файла. Так что c:\documents\mystuff\stuff.txt будет иметь путь со значением of "C:\documents\mystuff" очевидно, что формат абсолютных имен файлов и путей будет сильно отличаться от файловой системы к файловой системе.

URL-адрес-это susbset Ури с URL-адреса, как правило, представление ресурсов, доступных через http. Я не думаю, что есть какое-то железное правило о том, когда что-то должно быть URI против URL. Uri-это строки в виде "protocol: / / resource-identifier", такие как bitcoin: / / params,http://something.com?param=value. классы, такие как URL, обычно обертывают строку и предоставляют служебные методы, которые строка не будет иметь причин для предоставления.

нет такой вещи, как ресурс, по крайней мере, не в том смысле, о котором вы говорите. Просто поскольку метод называется getResource, это не означает, что он возвращает объект типа Resource.

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

Comments

    Ничего не найдено.