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?

questionAnswers(6)

yourAnswerToTheQuestion