Может ли существовать файловая система (Java 7), для которой Path .isAbsolute() имеет нулевой корень?
Javadoc для .isAbsolute()
говорит:
Сообщает, является ли этот путь абсолютным.
Абсолютный путь завершен в том смысле, что его не нужно объединять с другой информацией о пути, чтобы найти файл.Возвращает:
true
если и только если этот путь является абсолютным
Javadoc для .getRoot()
говорит:
Возвращает корневой компонент этого пути в виде объекта Path или ноль, если этот путь не имеет корневого компонента.
Возвращает: путь, представляющий корневой компонент этого пути, или
null
Итак, я в недоумении здесь; Существуют ли какие-либо файловые системы, для которых путь может быть абсолютно без корня вообще?
РЕДАКТИРОВАТЬ: обратите внимание, что могут быть пути, которые имеют корень, но не являются абсолютными. Например, это в системах Windows:
C:foo
;\foo\bar
,
Но я прошу об обратном: здесь нет корня и абсолюта.
3 ответа
Определение
В интерфейсе говорится о корнях:
Корневой компонент, который идентифицирует иерархию файловой системы, также может присутствовать.
Итак, как вы видите, комментарий, похоже, подразумевает, что корни используются для иерархий файловой системы. Теперь мы должны рассуждать о том, что такое абсолютный путь. Интерфейс говорит нам следующее:
Абсолютный путь завершен в том смысле, что его не нужно объединять с другой информацией о пути, чтобы найти файл.
Итак, как вы видите, в определении об абсолютных путях нет ни слова о корнях. Единственным ограничением является то, что мы должны быть в состоянии найти файл без дополнительной информации.
Иерархические файловые системы
Большинство файловых систем являются иерархическими, то есть они являются деревьями (или графами, если мы рассматриваем ссылки) или лесами. Корень в дереве - это узел, который не является дочерним по отношению к другому узлу (исключая ссылки). Файловые системы Windows - это, например, леса, так как они имеют много корней (C:
, D:
,...). Linux обычно имеет только один корень, который /
, Корни очень важны, так как без них было бы трудно начать поиск файла. В таких файловых системах обычно можно положиться на каждый абсолютный путь, имеющий корень.
Неиерархические файловые системы
Пока у нас есть иерархическая файловая система, мы можем предвидеть корень по абсолютному пути, но что, если у нас его нет? Тогда абсолютный путь может не содержать корень.
Пример, который мне приходит в голову: распределенные файловые системы, такие как Chord. Они часто не иерархичны, поэтому значение корней обычно не определено. Вместо этого файловый хеш идентифицирует файл (SHA-1 в Chord). Таким образом, допустимый путь Chord может выглядеть так:
cf23df2207d99a74fbe169e3eba035e633b65d94
Это абсолютный путь. Можно получить связанный файл без дополнительной информации, поэтому путь является абсолютным. Однако не вижу рута. Мы могли бы определить весь хеш как его собственный корень (тогда каждый файл был бы его собственным корнем), но никто не может гарантировать, что каждый человек, который реализует файловую систему Chord, согласится с этим. Так что могут быть разумные реализации, которые не рассматривают эти хэши как корни. В такой файловой системе каждый путь будет абсолютным, но ни один из них не будет содержать корня.
Если бы я реализовал неиерархическую файловую систему, я бы всегда возвращал null
как корень, как IMHO, корень не является определенной концепцией в неиерархической файловой системе. Так как я так думаю, другие разработчики тоже могут так думать. Следовательно, вы не можете предполагать, что каждый абсолютный путь имеет корень.
Обратите внимание, что распределенные файловые системы довольно распространены во многих областях, поэтому это не просто угловой случай, который никогда не будет реализован. Я думаю, что вы должны предвидеть это.
Заключение
- Интерфейс не требует, чтобы у каждого абсолютного пути был корень
- Существуют разумные файловые системы, в которых нет рута
- Учебное пособие по Oracle, упомянутое в комментариях, не является контрактом для интерфейса. Вы не должны полагаться на это
Так что будут люди, внедряющие файловые системы без корней; Вы должны предвидеть это.
Ну, есть некоторые неясные вещи с файловыми системами. Я сделал несколько поисковых роботов для предприятий, и где-то в будущем вы заметите некоторые странные вещи в файловой системе, происходящие с путями. Кстати, это все реализации пользовательских (переопределенных) файловых систем, так что никаких стандартных, и вы можете часами спорить о том, что из этого является хорошей идеей, а что нет... Тем не менее, я не думаю, что вы ' Я столкнусь с любым из этих случаев со стандартными файловыми системами.
Вот несколько примеров странных вещей:
Файлы в файловых системах контейнера (OLE2, ZIP, TAR и т. Д.): C:\foo\bar\blah.zip\myfile
В этом случае вы можете решить, какой элемент является "корневым":
- 'c: \'? Это не корень zip-файла, содержащего файл...
- 'c: \ foo \ bar \ blah.zip'? Это может быть корнем файла, но, делая это, он может сломать ваше приложение.
- 'blah.zip'? Может быть корнем zip-файла, но, несмотря на это, это может также повредить ваше приложение.
- '/'? Как в папке '/' в zip-файле? Это может быть возможно, но это даст вам серьезную головную боль в долгосрочной перспективе.
"Граф", как структуры, такие как HTTP:
- Тот факт, что у вас есть "/foo/bar", не означает, что "/ foo" или даже "/" существует. (Предположим, что соответствует вашему критерию). Единственное, что вы можете сделать, это ходить по графику...
- Обратите внимание, что такие протоколы, как WebDav, основаны на HTTP и могут вызывать похожую головную боль. У меня есть несколько примеров пользовательских файловых систем webdav, которые не имеют корневой папки, но имеют абсолютные пути.
Тем не менее, вы можете утверждать, что самый распространенный путь (если он существует...), к которому вы можете обратиться, - это корень или что есть корень - но вы просто не можете достичь его (даже если он действительно не существует).
Samba / NetBIOS
Если вы видите полную сеть Samba (Windows Network) как единую файловую систему, то в итоге вы получите "root", содержащий все рабочие группы, рабочую группу, содержащую все компьютеры, компьютер, содержащий все общие ресурсы, а затем файлы в общем ресурсе.,
Однако... корень и рабочие группы на самом деле не существуют. Это вещи, которые составлены из широковещательного протокола (что также весьма ненадежно, если у вас есть сеть из более чем 1000 компьютеров). С точки зрения сканера, в мире имеет смысл рассматривать каталоги "root" и "рабочая группа" совершенно иначе, чем (надежный) отдых.
тем не мение
Эти сценарии описывают только пути, где корень недоступен, ненадежен или что-то еще. Теоретически, я предполагаю, что в любом URL, который вы можете придумать, всегда есть корень. В конце концов, он состоит из строки символов, определяющих иерархию, которая поэтому по определению имеет начало.
Вопрос семантики
Из моего понимания предмета, абсолютный путь может быть абсолютным, только если его можно проследить до его корня. Как таковой, никогда не должно быть абсолютного пути без корня. В конечном итоге это сводится к семантике, и хотя мы можем найти определения, которые определяют абсолютный путь, например (см. Ниже);
- "абсолютный путь содержит корневой каталог и все другие подкаталоги"
- "Абсолютный путь - это путь, который указывает на одно и то же местоположение в одной файловой системе независимо от текущего рабочего каталога или объединенных путей. Как таковой, он всегда должен содержать корневой каталог".
Единственный реальный вопрос, оставшийся после этой точки, - соответствует ли определение Java API. Единственное место, где я могу найти ссылку на определение абсолютного пути (со ссылкой на корневой элемент) из официального источника Oracle, находится внутри официального руководства по Java. Официальные уроки Java говорят
Абсолютный путь всегда содержит корневой элемент
Если верить этому утверждению, то ни одна файловая система (независимо от того, насколько непонятной) не может содержать путь, который Java API будет считать абсолютным, если только он не считает, что он содержит корень.
Вы можете утверждать, что в некоторых неэхирархичных файловых системах вы можете столкнуться с некоторыми проблемами, решая, может ли файл быть его собственным корнем. Однако, согласно этому определению в API-интерфейсе пути (выделено мной), путь не должен представлять неиерархический элемент;
Путь представляет собой иерархический путь, состоящий из последовательности элементов каталога и имени файла.