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

Это ошибка в java jdk?

Когда я получил класс java.lang.File с кодом File file = new File("e:/");, конечно, я получил класс File, представленный в каталоге e: \.

Но если я получил класс File с кодом File file = new File("e:");, и я просто в диске E:, тогда я получил класс File, представленный в текущем каталоге.

Предположим, что я в каталоге E:\dir \, и этот каталог имеет файл с именем Test.java. Это содержимое:

import java.io.File;
public class Test {
    public static void main(String[] args) {
        File file = new File("e:"); 
        File[] files = file.listFiles(); 
        for(File f: files){ 
            System.out.println(f + " " + f.exists()); 
        }
    }
}

Откройте инструмент cmd и перейдите в каталог e:\dir, выполните в нем следующую команду:

E:\dir> javac Test.java
E:\dir> java Test

Я получил:

e:\Test.class false
e:\Test.java false

Является ли это ошибкой java jdk?


Дополнительная информация от @JimGarrison:

Я запустил этот код

public class Foo3
{
    public static void main(String[] args)  throws Exception
    {
        File f = new File("D:");
        System.out.println(f.getCanonicalPath());
        for (File x : f.listFiles())
            System.out.println(x + " " + x.getCanonicalPath() + " " + x.getAbsolutePath() + " " + x.exists() + " " + x.getAbsoluteFile().exists());
    }
}

в Eclipse (который живет на моем диске D:) и получил следующий вывод:

D:\dev\src\pdxep
D:\.classpath D:\dev\src\pdxep\.classpath D:\dev\src\pdxep\.classpath false true
D:\.project D:\dev\src\pdxep\.project D:\dev\src\pdxep\.project false true
D:\.settings D:\dev\src\pdxep\.settings D:\dev\src\pdxep\.settings false true
D:\gallery D:\dev\src\pdxep\gallery D:\dev\src\pdxep\gallery false true
D:\pom.xml D:\dev\src\pdxep\pom.xml D:\dev\src\pdxep\pom.xml false true
D:\src D:\dev\src\pdxep\src D:\dev\src\pdxep\src false true
D:\target D:\dev\src\pdxep\target D:\dev\src\pdxep\target false true

Что подтверждает, что что-то смешное происходит.

Java Ошибка 8130462, похоже, связана с тем, что она связана с относительными абсолютными путями, особенно в Windows.

4b9b3361

Ответ 1

Первая часть о получении File, представляющая текущий рабочий каталог с кодом File file = new File("e:");, не является ошибкой. Это относительный путь к диску Windows. То есть путь относительно текущего рабочего каталога в указанном диске. (Да, у Windows есть другой рабочий директор на диске)

Проблема заключается в том, что Java ошибочно добавляет \ после буквы диска в пути, которая делает путь похожим на абсолютный путь и, вероятно, из-за этого неправильно возвращает false на file.exists().

Однако Java правильно решает канонический путь и абсолютный путь и корректно возвращает true на x.getAbsoluteFile().exists(). Java также корректно возвращает содержимое CWD в file.listFiles(), как вы заметили в своем примере кода.

Я нашел старую ошибку в базе данных, которая JDK-5066567 об этом или, по крайней мере, очень похожа на это. Он был создан в 2004 году и установлен в "In progress" 2013, а текущий Assignee "неактивен", поэтому я не думаю, что мы увидим какое-либо исправление для этого в ближайшее время, если вообще когда-либо.

Итак, чтобы ответить на ваш вопрос, я бы сказал, да, это ошибка.

Однако, похоже, что он лучше обрабатывается в java.nio.file.Path. Поэтому, если вы можете использовать пакет java.nio.file.* вместо этого в своем прецеденте, это может быть приемлемым обходным решением.

Ответ 2

Это не ошибка.

  • E:/ означает, что вы указываете как диск, так и каталог

  • E: означает, что вы указываете только диск, каталог остается по умолчанию.

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

Это то, как он работает на большинстве файловых систем.