Come ottenere il percorso assoluto del file nella cartella / resources del progetto


95

Assumi una configurazione standard per esperti.

Di 'che nella cartella delle risorse hai un file abc.

In Java, come posso ottenere il percorso assoluto del file per favore?


Vuoi scrivere un plugin Maven? O vuoi accedere al file quando il tuo programma viene eseguito?
Gyro Gearless


Ci sono tre varianti di soluzione, a seconda della situazione: stackoverflow.com/a/56327069/715269
Gangnus

Risposte:


73

È possibile utilizzare il ClassLoader.getResourcemetodo per ottenere la risorsa corretta.

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

O

Anche se questo potrebbe non funzionare sempre, una soluzione più semplice:

Puoi creare un Fileoggetto e utilizzare il getAbsolutePathmetodo:

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();

8
Un consiglio di uso limitato, in quanto si basa sulla directory di lavoro per essere il root esperto. E anche in questo caso, dovresti piuttosto usarlo target/classes/abc.txtper fare riferimento al file, poiché questo è il luogo canonico in cui Maven inserisce i file di risorse dopo l'elaborazione (ad esempio, il plugin maven-resources potrebbe aver eseguito la sostituzione delle proprietà su abc.txt). È molto meglio usare abc.txt tramite getResource () dal classpath.
Gyro Gearless

2
Cosa succede se un utente finale esegue la tua applicazione come un JAR eseguibile? Quindi non ci sarà affatto un file fisico. Questo è un altro motivo per cui dovresti usare getResource (), e ad esempio aprire il flusso di input a seconda di cosa vuoi fare con esso.
Matthew Wise,

6
Può essere rimosso come risposta corretta? @Karol S ha risposto di seguito - questa dovrebbe essere la risposta corretta (da qui la discrepanza di
voto positivo

3
Risposta sbagliata. Si prega di fare riferimento alla risposta di seguito di @Karol
bhathiya-perera

167

Il modo corretto che funziona effettivamente:

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

Non importa ora dove sia fisicamente il file nel classpath, verrà trovato fintanto che la risorsa è effettivamente un file e non una voce JAR.

(L'apparentemente ovvio new File(resource.getPath())non funziona per tutti i percorsi! Il percorso è ancora codificato in URL!)


5
O presumibilmente potresti semplicemente fare: new File(resource.toURI()).getAbsolutePath();(cioè non penso che tu abbia bisogno dell'oggetto Path?)
Dan King

1
Buon consiglio su toURI (), questo evita che gli spazi nel percorso risultino% 20!
Matthew Wise,

29
Grazie! Questo ha quasi funzionato per me. Ma ho dovuto fare una modifica: YourClass.class.getClassLoader (). GetResource ("abc");
yngwietiger

Puoi farlo in alternativa, new File(YourClass.class.getResource("abc").toURI().getPath())se lo desideri.
Mike Rylander

2
Non capisco come abbia funzionato per così tante persone senza la barra di partenza:.getResource("/abc")
cahen

28

È necessario specificare il percorso da cui partire /

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();

12

Crea l'istanza classLoader della classe che ti serve, quindi puoi accedere facilmente ai file o alle risorse. ora accedi a path usando il getPath()metodo di quella classe.

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);

1

Per restituire un file o un percorso file

URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath();  // return file path

0

Ci sono due problemi sulla nostra strada verso il percorso assoluto:

  1. Il posizionamento trovato non sarà dove si trovano i file di origine, ma dove viene salvata la classe. E la cartella delle risorse quasi sicuramente si troverà da qualche parte nella cartella di origine del progetto.
  2. Le stesse funzioni per il recupero della risorsa funzionano in modo diverso se la classe viene eseguita in un plugin o in un pacchetto direttamente nell'area di lavoro.

Il codice seguente ci fornirà tutti i percorsi utili:

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

Qui vengono ricercate entrambe le funzioni che possono essere utilizzate per la localizzazione della cartella delle risorse. Quanto a class, può essere ottenuto in entrambi i modi, staticamente o dinamicamente.


Se il progetto non è nel plugin, il codice, se eseguito in JUnit, stamperà:

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

Quindi, per arrivare a src / rest / resources dovremmo andare su e giù nell'albero dei file. Possono essere utilizzati entrambi i metodi. Nota, non possiamo usarlo getResource(resourceFolderName), poiché quella cartella non è nella cartella di destinazione. Nessuno mette risorse nelle cartelle create, spero.


Se la classe è nel pacchetto che si trova nel plugin, l'output dello stesso test sarà:

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

Quindi, ancora una volta dovremmo andare su e giù per l'albero delle cartelle.


Il più interessante è il caso in cui il pacchetto viene avviato nel plugin. Come test del plugin JUnit, per il nostro esempio. L'output è:

loaderDir = /C:.../ws/plugin/
 localDir = /package/

Qui possiamo ottenere il percorso assoluto solo combinando i risultati di entrambe le funzioni. E non è abbastanza. Tra di loro dovremmo mettere il percorso locale del luogo in cui si trovano i pacchetti delle classi, relativamente alla cartella dei plugin. Probabilmente, dovrai inserire qualcosa come srcosrc/test/resource qui.

Puoi inserire il codice nel tuo e vedere i percorsi che hai.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.