Подтвердить что ты не робот

Может ли быть (Java 7) FileSystem, для которой Path.isAbsolute() но имеет нулевой корень?

В javadoc для .isAbsolute() говорится:

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

Возврат: true, если и только если этот путь является абсолютным

В javadoc для .getRoot() говорится:

Возвращает корневой компонент этого пути как объект Path или null, если этот путь не имеет корневого компонента.

Возврат:путь, представляющий корневую составляющую этого пути, или null

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


EDIT: обратите внимание, что CAN может быть путями, которые имеют корень, но НЕ являются абсолютными. Например, в системах Windows:

  • C:foo;
  • \foo\bar.

Но я прошу об обратном здесь: нет корня и абсолюта.

4b9b3361

Ответ 1

Определение

В интерфейсе указано следующее о корнях:

Также может присутствовать корневой компонент, который идентифицирует иерархию файловой системы.

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

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

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

Иерархические файловые системы

Большинство файловых систем являются иерархическими, т.е. они являются деревьями (или графиками, если мы рассматриваем ссылки) или леса. Корень в дереве - это node, который не является потомком другого node (исключая ссылки). Файловые системы Windows - это, например, леса, поскольку у них много корней (C:, D:,...). У Linux обычно есть только один корень, который /. Корни очень важны, так как без них было бы трудно начать поиск файла. В таких файловых системах вы обычно можете полагаться на каждый абсолютный путь с корнем.

Неиерархические файловые системы

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

Пример, который приходит мне на ум: распределенные файловые системы, такие как Chord. Они часто не иерархичны, поэтому значение корней обычно undefined. Вместо этого хэш файла идентифицирует файл (SHA-1 в Chord). Таким образом, допустимый путь Chord может выглядеть так:

cf23df2207d99a74fbe169e3eba035e633b65d94

Это абсолютный путь. Можно получить связанный файл без дополнительной информации, поэтому путь является абсолютным. Однако я не вижу корня. Мы могли бы определить, что весь хэш является его собственным корнем (тогда каждый файл будет его собственным корнем), но никто не может гарантировать, что каждый человек, который реализует файловую систему Chord, согласится на это. Таким образом, могут быть разумные реализации, которые не обрабатывают эти хеши как корни. В такой файловой системе каждый путь будет абсолютным, но ни один из них не будет содержать корень.

Если бы я реализовал неиерархическую файловую систему, я всегда возвращал бы null как root, так как ИМХО, root не является определенной концепцией в неиерархической файловой системе. Поскольку я так думаю, другие разработчики тоже так думают. Следовательно, вы можете не предполагать, что каждый абсолютный путь имеет корень.

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

Заключение

  • Интерфейс не гарантирует, что каждый абсолютный путь должен иметь root
  • Существуют разумные файловые системы, в которых отсутствие корня имеет смысл
  • Учебник Oracle, упомянутый в комментариях, не является контрактом для интерфейса. Вы не должны полагаться на это.

Таким образом, люди будут внедрять файловые системы без корней; вы должны ожидать этого.

Ответ 2

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

Вот несколько примеров странных вещей:

Файлы в файловых системах контейнеров (OLE2, ZIP, TAR и т.д.): c:\foo\bar\blah.zip\myfile

В этом случае вы можете решить, какой элемент является "корнем":

  • 'c: \'? Это не корень zip файла, содержащего файл...
  • 'c:\foo\bar\blah.zip'? Это может быть корень файла, но при этом он может разорвать ваше приложение.
  • 'blah.zip'? Возможно, это корень zip файла, но, несмотря на это, возможно, это может сломать и ваше приложение.
  • '/'? Как в папке "/" в zip файле? Это может быть возможно, но это даст вам серьезную головную боль в долгосрочной перспективе.

'graph', подобные структурам, например HTTP:

  • Тот факт, что у вас есть /foo/bar, не означает, что существует '/foo' или даже '/'. (Предположим, что соответствует вашему критерию). Единственное, что вы можете сделать, это пройти график...
  • Обратите внимание, что такие протоколы, как WebDav, основаны на HTTP и могут дать вам аналогичную головную боль. У меня есть несколько примеров пользовательских файловых систем webdav, которые не имеют "корневой" папки, но имеют абсолютные пути.

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

Samba/NetBIOS

Если вы видите полную сеть Samba (сети Windows) как единую файловую систему, то в основном вы получаете "корень", содержащий все рабочие группы, рабочую группу, содержащую все компьютеры, компьютер, содержащий все домены, а затем файлы в разделе.

Однако... корень и рабочие группы на самом деле не существуют. Это вещи, которые составлены из широковещательного протокола (что также весьма ненадежно, если у вас сеть из более 1000 компьютеров). С точки зрения искателя, весь смысл в мире заключается в том, чтобы обращаться к каталогам "root" и "workgroup", полностью отличным от (надежного) отдыха.

Однако

В этом сценарии описываются только пути, в которых корень недоступен, ненадежен или что-то еще. Теоретически, я полагаю, что в любом URL-адресе, о котором вы можете думать, всегда есть корень. В конце концов, это составлено как строка символов, определяющая иерархию, которая по определению имеет начало.

Ответ 3

Вопрос о семантике

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

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

Абсолютный путь всегда содержит корневой элемент

Если это утверждение следует верить, то никакая файловая система (как бы неясно) не может содержать Путь, который Java API будет считать абсолютным, если он также не считает, что он содержит корень.

Можно утверждать, что в некоторых нетиррхических файловых системах вы можете столкнуться с некоторыми проблемами, решающими, может ли файл быть его собственным корнем. Однако по этому определению в Path API (выделение мое) путь не должен представлять собой неиерархический элемент;

Путь представляет собой путь иерархический и состоит из последовательность элементов каталога и имени файла