Конструктор пустого файла не является ни файлом, ни каталогом - PullRequest
0 голосов
/ 12 июня 2018

В чем разница между следующими двумя способами создания файла?

new File(System.getProperty("user.dir"));
new File("");

Java идентифицирует первый как каталог, а второй не является ни файлом, ни каталогом !Почему это так?


Код:

public class MainClass {
    public static void main(String[] args) throws Exception {       
        System.out.println("File Created with CurrentDir taken From System Props");
        File f1 = new File(System.getProperty("user.dir"));
        System.out.println("Absolute Path: " + f1.getAbsolutePath());
        System.out.println("isDirectory: " + f1.isDirectory());
        System.out.println("isFile: " + f1.isFile());

        System.out.println();

        System.out.println("File Created with Empty String Path");
        File f2 = new File("");
        System.out.println("Absolute Path: " + f2.getAbsolutePath());
        System.out.println("isdirectory: " + f2.isDirectory());
        System.out.println("isFile: " + f2.isFile());       
    }
}

Выход:

File Created with CurrentDir taken From System Props
Absolute Path: D:\Java Workspace\my_Workspace\JavaTest
isDirectory: true
isFile: false

File Created with Empty String Path
Absolute Path: D:\Java Workspace\my_Workspace\JavaTest
isdirectory: false
isFile: false

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

Объяснение

Может показаться немного неинтуитивным , но на самом деле именно так класс должен работать согласно его документации .Он называется пустой абстрактный путь в документации:

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

А из вашего конструктора File#File(String):

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

Так что класс File фактически интерпретирует пустое имя как настоящее имя.Когда вы тестируете File#isDirectory() или File#isFile(), он, таким образом, проверяет, существует ли файл или каталог, например

D:\Java Workspace\iTAW_Workspace\JavaTest\<empty>

. Обратите внимание на <empty>, который я написал, чтобы указать, что он на самом деле ищет файл здесь с пустое имя .Очевидно, что такой файл не может существовать, поэтому результат всегда будет false.Итак, еще раз, он не проверяет

D:\Java Workspace\iTAW_Workspace\JavaTest\

, а вместо этого пустой файл в этом каталоге, который не существует.

К сожалению, вы не видите этого, когдаиспользуя метод File#toAbsolutePath(), поскольку нет представления для пустого имени .


NIO

Обратите внимание, что класс File и все, что с ним связано устарел .В настоящее время файловый ввод-вывод выполняется с использованием NIO, вращающегося вокруг Files, Paths и Path.Этот API намного понятнее и понятнее.Он также будет работать так, как задумано в вашем текущем примере:

Files.isDirectory(Paths.get("")); // true

Подробнее смотрите в документации 1065 *.

0 голосов
/ 12 июня 2018

new File ("") создает новый файл с относительным (пустым) путем.Поскольку этот файл не существует, isDirectory () и isFile () возвращают false (соответствует javadoc).

Из javadoc

логический java.io.File.isDirectory ()

...

Возвращает: true, если и только если файл, обозначенный этим абстрактным путем, существует и является каталогом;false в противном случае

То же самое верно для isFile ().и пока ваш файл не существует, оба метода возвращают false.

0 голосов
/ 12 июня 2018

Вам необходимо различать объектный файл Java и файл, фактически присутствующий на вашем компьютере.

В первом случае: new File(System.getProperty("user.dir")).Вы создаете объектный файл Java и указываете ему путь: System.getProperty("user.dir").Позже, когда вы вызываете функцию .getAbsolutePath(), она возвращает вам путь, который вы указали.Затем, когда вы вызываете .isDirectory(), он говорит вам true, потому что существует каталог, соответствующий этому объектному файлу Java.


Во втором случае new File("") он создает объектный файл Java и вы даете емупуть: "".Поскольку указанный путь не является абсолютным, система преобразует его как относительный из пути user.dir.

из документации

Путь, абстрактный или в виде строки, может быть как абсолютным, так и относительным.Абсолютный путь завершен в том, что никакой другой информации не требуется, чтобы найти файл, который он обозначает.Относительный путь, напротив, должен интерпретироваться в терминах информации, взятой из другого пути.По умолчанию классы в пакете java.io всегда разрешают относительные пути к текущему пользовательскому каталогу.Этот каталог называется системным свойством user.dir и обычно является каталогом, в котором была вызвана виртуальная машина Java.

Позже, когда вы вызываете функцию .getAbsolutePath(), он возвращает вам путь, по которому выдал, поэтому путь к пользователю dir + пустая строка: D:\Java Workspace\iTAW_Workspace\JavaTest\<empty>.Затем, когда вы вызываете .isDirectory(), он говорит вам ложь, потому что нет каталога, соответствующего этому пути.(та же причина для isFile())

0 голосов
/ 12 июня 2018

Создание файла с пустой строкой приводит к созданию экземпляра File, который на самом деле не существует и его абсолютный путь - «пустой абстрактный путь».

-> Вот почемувторой не файл и не каталог для вас .

Причиной этого, возможно, немного запутанного для вас вывода, является определение, расположенное в javadocs:

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

Подробнее об этой теме можно узнать здесь.https://docs.oracle.com/javase/6/docs/api/java/io/File.html

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