Новый файл ("") против нового файла ("."): функция или ошибка? - PullRequest
33 голосов
/ 04 мая 2011

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

Ответы [ 3 ]

14 голосов
/ 04 мая 2011

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

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

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

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

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

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

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

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

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

10 голосов
/ 04 мая 2011

Передавая пустую строку в конструктор, вы создаете пустое «абстрактное имя пути».Из java.io.File Javadoc :

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

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

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

5 голосов
/ 04 мая 2011

По данным javaDocs:

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

В первом примере вы имеете в виду «файл без имени».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...