Jak Java rozwiązuje ścieżkę względną w nowym pliku ()?
Próbuję zrozumieć sposób, w jaki Java rozwiązuje ścieżkę względną podczas tworzeniaFile
obiekt.
Używany system operacyjny: Windows
Dla poniższego fragmentu otrzymujęIOException
ponieważ nie może znaleźć ścieżki:
@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();
}
}
Moje rozumienie jest następujące: Java traktuje podaną ścieżkę jako absolutną i zwraca błąd, gdy ścieżka nie istnieje. Więc to ma sens.
Kiedy zaktualizuję powyższy kod, aby użyć ścieżki względnej:
@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();
}
}
Tworzy nowy plik i udostępnia następujące dane wyjściowe:
test\..\test.txt
C:\JavaForTesters\test\..\test.txt
C:\JavaForTesters\test.txt
W tym przypadku zakładam, że nawet jeśli podana ścieżka nie istnieje, ponieważ ścieżka zawiera „/../”, java traktuje to jako ścieżkę względną i tworzy plik wuser.dir
. Więc to też ma sens.
Ale jeśli zaktualizuję ścieżkę względną jak poniżej:
@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();
}
}
Następnie otrzymuję IOException: Odmowa dostępu.
Moje pytania to:
czemu"test/../test.txt"
jest traktowany jako ścieżka względna i tworzy plik w"user.dir"
ale"test/../../test.txt"
zwraca błąd? Gdzie próbuje utworzyć plik dla ścieżki"test/../../test.txt"
?Gdy określona ścieżka względna nie zostanie znaleziona, plik wydaje się być utworzony wuser.dir
. Wydaje mi się, że poniższe dwa scenariusze robią to samo:
//scenario 1
File f = new File("test/../test.txt");
f.createNewFile();
//scenario 2
File f = new File("test.txt");
f.createNewFile();
Czy jest więc przypadek świata rzeczywistego, w którym można użyć scenariusza 1 zamiast scenariusza 2?
Przypuszczam, że brakuje mi tutaj czegoś oczywistego lub zasadniczo źle zrozumiałem ścieżki względne. Przejrzałem dokumentację Java dla pliku i nie mogę znaleźć wyjaśnienia tego. W Przepełnieniu stosu jest sporo pytań dotyczących ścieżek względnych, ale te, które sprawdziłem, dotyczyły konkretnych scenariuszy, a nie dokładnie tego, jak rozwiązano ścieżki względne.
Będzie wspaniale, jeśli ktoś może mi wyjaśnić, jak to działa lub wskazać jakieś powiązane linki?