В чем разница между ресурсом, 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) достаточно? (а есть ли ресурсный объект?)
Извините, если этот вопрос немного неорганизован; он просто отражает путаницу, которую я имею... :)
5 ответов:
обновление 2017-04-12 Регистрация ответ JvR поскольку он содержит более исчерпывающее и точное объяснение!
обратите внимание, что я не считаю себя на 100% компетентным ответить, но тем не менее вот некоторые комментарии:
Fileпредставляет файл или каталог, доступный через файловую систему- ресурс это общий термин для объекта данных, который может быть загружен приложение
- обычно ресурсы файлы, распространяемые с приложением / библиотекой и загружаемые через механизм загрузки классов (когда они находятся на пути к классу)
URL#getPathявляется геттер на пути часть URL (protocol://host/path?query)URL#getFileсогласно JavaDoc возвращаетpath+queryВ Java,
URI- это просто структура данных для управления самим универсальным идентификатором.
URLс другой стороны, это действительно локатор ресурсов и предлагает вам функции для фактического чтения ресурса через registeredURLStreamHandlers.URL-адреса могут привести к ресурсам файловой системы, и вы можете построить URL-адрес для каждого ресурса файловой системы с помощью
file://протокол (отсюдаFileURLсвязи).также имейте в виду, что это
URL#getFileне относится кjava.io.File.
зачем мне нужен объект File; почему это не ресурс (URL) достаточно?
этого достаточно. Только если вы хотите передать ресурс в какой-то компонент, который может работать только с файлами, вам нужно получить
Fileот него. Однако не все URL-адреса ресурсов могут быть преобразованы вFiles.а есть ли ресурсный объект?
С точки зрения 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#getFilevsjava.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