Я пытаюсь понять, как Java разрешает относительный путь при создании объекта File
.
Используемая ОС: Windows
Для нижеприведенного фрагмента я получаю IOException
, поскольку он не может найти путь:
@Test
public void testPathConversion() {
File f = new File("test/test.txt");
try {
f.createNewFile();
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
} catch (Exception e) {
e.printStackTrace();
}
}
Мое понимание здесь: Java рассматривает путь, указанный как абсолютный, и возвращает ошибку, когда путь не существует. Так что это имеет смысл.
Когда я обновляю приведенный выше код для использования относительного пути:
@Test
public void testPathConversion() {
File f = new File("test/../test.txt");
try {
f.createNewFile();
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
} catch (Exception e) {
e.printStackTrace();
}
}
Создает новый файл и предоставляет следующий результат:
test\..\test.txt
C:\JavaForTesters\test\..\test.txt
C:\JavaForTesters\test.txt
В этом случае мое предположение, даже если указанный путь не существует, поскольку путь содержит "/../", java рассматривает это как относительный путь и создает файл в user.dir
. Таким образом, это также имеет смысл.
Но если я обновляю относительный путь, как показано ниже:
@Test
public void testPathConversion() {
File f = new File("test/../../test.txt");
try {
f.createNewFile();
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
} catch (Exception e) {
e.printStackTrace();
}
}
Затем я получаю IOException: доступ запрещен.
Мои вопросы:
- Почему
"test/../test.txt"
рассматривается как относительный путь и создает файл в"user.dir"
, но"test/../../test.txt"
возвращает ошибку? Где он пытается создать файл для пути"test/../../test.txt"
? -
Если указанный относительный путь не найден, файл создается в
user.dir
. Итак, мне кажется, что следующие два сценария делают одно и то же://scenario 1 File f = new File("test/../test.txt"); f.createNewFile(); //scenario 2 File f = new File("test.txt"); f.createNewFile();
Итак, существует ли реальный случай, когда можно использовать сценарий 1 вместо сценария 2?
Я полагаю, что я упускаю что-то очевидное здесь или принципиально неправильно понял относительные пути. Я просмотрел документы Java для файла, и я не могу найти объяснения этого. В Qaru имеется довольно много вопросов относительно относительных путей, но те, которые я искал, касались конкретных сценариев, а не точно, как разрешены относительные пути.
Будет здорово, если кто-нибудь сможет объяснить мне, как это работает или указывать на некоторые связанные ссылки?