Я пытаюсь понять, как Java разрешает относительный путь при создании объекта File
.Как Java разрешает относительный путь в новом файле()?
OS используется: 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 для файла, и я не могу найти объяснения этого. В Stack Overflow имеется довольно много вопросов относительно относительных путей, но те, которые я искал, касались конкретных сценариев, а не точно, как разрешены относительные пути.
Будет здорово, если кто-то может объяснить мне, как это работает или указывать на некоторые связанные ссылки?
Обратите внимание, что 'user.dir' является довольно изменчивым местом, которое было бы хрупким для приложения, на которое можно положиться. Еще один фактор, который следует учитывать, - это приложение.не может быть установлен в месте, где у него есть права на запись. ** Было бы более оптимальным и надежным сделать файл в (подкаталог) 'user.home'. См. [Этот ответ] (http://stackoverflow.com/a/10166623/418556) для краткого примера. –
Примечание: 'test/test.txt' и' test /../ test.txt' - оба относительных пути. Относительно этого значения не имеет ничего общего с наличием встроенных компонентов '..'. – Boann