Почему File.getAbsolutePath () и File.getCanonicalPath () включают
имя файла? Javadocs указывают, что имя каталога должно быть
вернулся.
Нет, нет. Если вы хотите указать, почему, по вашему мнению, они это делают, кто-то может определить ошибку в ваших рассуждениях. Кроме того, если вы укажете, что именно вы хотели бы видеть для вывода, учитывая какой-то конкретный вклад, мы также можем вам помочь. Название вашего вопроса также кажется странным, поскольку ваша проблема, похоже, в том, что означает , возвращая полный путь к файлу.
Редактировать: Мне кажется, я понимаю источник вашего замешательства. A File представляет путь к файловой системе независимо от платформы. Это может быть путь к файлу или каталогу. Он также всегда представляет один и тот же путь, но не обязательно один и тот же абсолютный путь. Это очень тонкое различие, но очень важное. Объект File, представляющий относительный путь, всегда относительный . Имея файл, представляющий относительный путь, вы можете получить текущий соответствующий абсолютный путь, используя getAbsolutePath (). Это, однако, не меняет того факта, что Файл представляет собой относительный путь. Дальнейшие вызовы getAbsolutePath () для одного и того же объекта File могут возвращать разные значения. Рассмотрим, например:
// A relative file
File foo = new File("foo.txt");
// Resolve relative file against CWD
System.out.println(foo.getAbsolutePath());
// Output: D:\dev\projects\testbed\foo.txt
System.setProperty("user.dir", "C:\\somewhere");
// Resolve relative file against new CWD
System.out.println(foo.getAbsolutePath());
// Output: C:\somewhere\foo.txt
// Get an absolute file
File absoluteFoo = foo.getAbsoluteFile();
// Show absolute path
System.out.println(absoluteFoo.getAbsolutePath());
// Output: C:\somewhere\foo.txt
System.setProperty("user.dir", "D:\\somewhere-else");
// An absolute path doesn't change when the CWD changes
System.out.println(absoluteFoo.getAbsolutePath());
// Output: C:\somewhere\foo.txt
Теперь должно быть ясно, что путь, который представляет Файл, это только путь: путь. Кроме того, путь может состоять из нуля или более частей, и вызов getParent () для любого файла возвращает путь к этому файлу с последним удаленным элементом пути, если не существует «последнего элемента пути» для удаления. Таким образом, ожидаемый результат new File("foo").getParent()
равен null
, поскольку относительный путь "foo" не имеет родителя.
Из приведенного выше примера и объяснения вы должны увидеть, что способ получить содержащий каталог при создании объекта File с относительным путем -
String absoluteParentDirPath = someRelativeFile.getAbsoluteFile().getParent();
с оговоркой, что "абсолютный путь" зависит от вашей среды в то время.
Дополнительное примечание: поскольку File является Serializable, вы можете записать файл относительного пути на диск или отправить его по сети. Этот файл после десериализации в другой JVM все равно будет представлять относительный путь и будет сопоставлен с любым текущим рабочим каталогом этой JVM.