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

Новый файл ( ") по сравнению с новым файлом ("."): функция или ошибка?

new File("") и new File(".") дают один и тот же канонический путь, но первый объект не подлежит. Рассмотрим ниже код и как оба объекта возвращают один и тот же канонический путь. В документации говорится, что канонический путь является "абсолютным и уникальным". Но только файл, созданный с помощью "." аргумент действительно полезен.

Не следует ли в какой-то момент исключить исключение? Либо в вызове конструктора пустой строки (поскольку созданный объект не выглядит корректным), либо, по крайней мере, в getCanonicalPath (который хотя бы объявляет IOException)?

import java.io.File;
import java.io.IOException;

public abstract class Test {

    public static void main(String[] args) throws Exception {
        testFile("");
        testFile(".");
    }

    private static void testFile(String arg) throws IOException {
        System.out.format("File constructor argument: \"%s\"\n", arg);
        File g = new File(arg);
      System.out.format("toString()            = \"%s\"\n", g.toString());
        System.out.format("getAbsolutePath()     = \"%s\"\n", g.getAbsolutePath());
        System.out.format("getAbsoluteFile()     = \"%s\"\n", g.getAbsoluteFile());
        System.out.format("getgetCanonicalPath() = \"%s\"\n", g.getCanonicalPath());
        System.out.format("getgetCanonicalFile() = \"%s\"\n", g.getCanonicalFile());
        System.out.format("exists()              = %s\n", g.exists());
        System.out.format("isDirectory()         = %s\n", g.isDirectory());
        System.out.println();
  }
}

И вывод, который он производит:

File constructor argument: ""
toString()            = ""
getAbsolutePath()     = "C:\usr\workspace\Test"
getAbsoluteFile()     = "C:\usr\workspace\Test"
getgetCanonicalPath() = "C:\usr\workspace\Test"
getgetCanonicalFile() = "C:\usr\workspace\Test"
exists()              = false
isDirectory()         = false

File constructor argument: "."
toString()            = "."
getAbsolutePath()     = "C:\usr\workspace\Test\."
getAbsoluteFile()     = "C:\usr\workspace\Test\."
getgetCanonicalPath() = "C:\usr\workspace\Test"
getgetCanonicalFile() = "C:\usr\workspace\Test"
exists()              = true
isDirectory()         = true
4b9b3361

Ответ 1

При использовании конструктора с пустой строкой вы создаете экземпляр File, который имеет два свойства:

  • На самом деле он не существует.
  • Его абсолютный путь - это "пустой абстрактный путь"

При использовании File ( "." ) вы создаете другой файл:

  • Он существует в файловой системе
  • Его абсолютный путь содержит "." символ

Этот второй файл существует, а не первый. Следовательно, второй файл является единственным, который должен уважать правило, описанное в getCanonicalPath:

Каждое имя пути, которое обозначает существующий файл или каталог, имеет уникальную каноническую форму.

Поскольку первый файл не является реальным, тот факт, что их канонические пути равны, не имеет смысла.

Следовательно, поведение, которое вы указали, не является ошибкой. Это тот, который мы ожидали от JVM.

Вы найдете всю информацию в javadoc

Ответ 2

Передавая пустую строку конструктору, вы создаете пустой "абстрактный путь". Из java.io.File Javadoc:

Если заданная строка является пустой строка, то результатом будет пустой абстрактный путь.

"Пустое абстрактное имя пути" в этом случае физически не существует, поэтому exists() оценивается как false. Причина, по которой вы получаете каталог для пустой строки, описана в Javadoc getAbsolutePath:

Если этот абстрактный путь является пустым абстрактный путь, затем путь строка текущего каталога пользователя, который назван системным свойством user.dir, возвращается.

Ответ 3

В соответствии с javaDocs:

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

В первом примере вы ссылаетесь на "файл, который не имеет имени".

Поскольку этого не существует, я не считаю ошибкой, что новый File ( ") и новый File (".") дают тот же канонический путь.