aggiornamento - piattaforma java




Qual è la differenza tra getPath(), getAbsolutePath() e getCanonicalPath() in Java? (4)

Qual è la differenza tra getPath() , getAbsolutePath() e getCanonicalPath() in Java?

E quando lo uso?


Considera questi nomi di file:

C:\temp\file.txt - Questo è un percorso, un percorso assoluto e un percorso canonico.

.\file.txt - Questo è un percorso. Non è né un percorso assoluto né un percorso canonico.

C:\temp\myapp\bin\..\\..\file.txt - Questo è un percorso e un percorso assoluto. Non è un percorso canonico.

Un percorso canonico è sempre un percorso assoluto.

La conversione da un percorso a un percorso canonico lo rende assoluto (di solito virano sulla directory di lavoro corrente, ad esempio ./file.txt diventa c:/temp/file.txt ). Il percorso canonico di un file "purifica" semplicemente il percorso, rimuovendo e risolvendo cose come ..\ e risolvendo i collegamenti simbolici (sugli unix).

Si noti inoltre il seguente esempio con nio.Path:

String canonical_path_string = "C:\\Windows\\System32\\";
String absolute_path_string = "C:\\Windows\\System32\\drivers\\..\\";

System.out.println(Paths.get(canonical_path_string).getParent());
System.out.println(Paths.get(absolute_path_string).getParent());

Mentre entrambi i percorsi si riferiscono alla stessa posizione, l'output sarà abbastanza diverso:

C:\Windows
C:\Windows\System32\drivers

Il modo migliore che ho trovato per avere un'idea di cose del genere è provarli:

import java.io.File;
public class PathTesting {
    public static void main(String [] args) {
        File f = new File("test/.././file.txt");
        System.out.println(f.getPath());
        System.out.println(f.getAbsolutePath());
        try {
            System.out.println(f.getCanonicalPath());
        }
        catch(Exception e) {}
    }
}

Il tuo output sarà qualcosa del tipo:

test\..\.\file.txt
C:\projects\sandbox\trunk\test\..\.\file.txt
C:\projects\sandbox\trunk\file.txt

Quindi, getPath() ti fornisce il percorso basato sull'oggetto File, che può essere o non essere relativo; getAbsolutePath() ti fornisce un percorso assoluto per il file; e getCanonicalPath() ti dà il percorso assoluto unico per il file. Si noti che esiste un numero enorme di percorsi assoluti che puntano allo stesso file, ma solo un percorso canonico.

Quando usarli? Dipende da cosa stai cercando di realizzare, ma se stai cercando di vedere se due Files puntano allo stesso file sul disco, puoi confrontare i loro percorsi canonici. Solo un esempio


La cosa importante da capire è che la classe File tenta di rappresentare una vista di ciò che a Sun piace chiamare "pathname gerarchici" (fondamentalmente un percorso come c:/foo.txt o /usr/muggins ). Questo è il motivo per cui si creano file in termini di percorsi. Le operazioni che stai descrivendo sono tutte operazioni su questo "percorso".

  • getPath() recupera il percorso con il quale il file è stato creato con ( ../foo.txt )
  • getAbsolutePath() recupera il percorso con cui è stato creato il file, ma include informazioni sulla directory corrente se il percorso è relativo ( /usr/bobstuff/../foo.txt )
  • getCanonicalPath() tenta di recuperare una rappresentazione univoca del percorso assoluto del file. Questo elimina l'indirezione da ".." e "." riferimenti ( /usr/foo.txt ).

Nota Dico tentativi : nella formazione di un percorso canonico, la VM può lanciare una IOException . Questo di solito si verifica perché sta eseguendo alcune operazioni sul filesystem, ognuna delle quali potrebbe fallire.


Trovo raramente ho bisogno di utilizzare getCanonicalPath() ma, se fornito un file con un nome file che è in formato DOS 8.3 su Windows, come la proprietà di sistema java.io.tmpdir restituisce, allora questo metodo restituirà il "pieno" nome del file.





java