Чтобы лучше понять, что, возможно, происходит, я бы порекомендовал отладку кода Ниже я объясню, в чем может быть проблема, основываясь на моем понимании исходного кода.
Прежде всего, существуют различные реализации Path
, и, как вы упомянули, вы работаете в Windows, поэтому я взглянул на исходный код WindowsPath
, который я нашел здесь .
Так что метод Path.toFile()
довольно прост. Это:
public final File toFile() {
return new File(this.toString());
}
this
относится к экземпляру реализации Path, а в случае Windows это реализация WindowsPath
.
Глядя на класс WindowsPath
, мы видим, что toString()
реализован следующим образом:
@Override
public String toString() {
return path;
}
Теперь посмотрим, как создается эта переменная path
. Класс WindowsPath
вызывает класс WindowsPathParser
, который строит путь. Источник для WindowsPathParser
можно найти здесь .
В методе parse
в WindowsPathParser
вам нужно отладить, чтобы точно узнать, что происходит. В зависимости от вашего начального path
, который вы передаете в качестве параметра метода, этот метод анализирует его как другой WindowsPathType
, например. ABSOLUTE, DIRECTORY_RELATIVE.
Приведенный ниже код показывает, как начальный вход path
может изменить тип WindowsPathType
Код
private static final String OUTPUT = "Path to [%s] is [%s]";
public static void main(String args[]) throws NoSuchFieldException, IllegalAccessException {
printPathInformation("c:\\dev\\code");
printPathInformation("\\c\\dev\\code");
}
private static void printPathInformation(String path) throws NoSuchFieldException, IllegalAccessException {
Path windowsPath = Paths.get(path);
Object type = getWindowsPathType(windowsPath);
System.out.println(String.format(OUTPUT,path, type));
}
private static Object getWindowsPathType(Path path) throws NoSuchFieldException, IllegalAccessException {
Field type = path.getClass().getDeclaredField("type");
type.setAccessible(true);
return type.get(path);
}
выход
Path to [c:\dev\code] is [ABSOLUTE]
Path to [\c\dev\code] is [DIRECTORY_RELATIVE]