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?
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?
Risposte:
È possibile utilizzare il ClassLoader.getResource
metodo 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 File
oggetto e utilizzare il getAbsolutePath
metodo:
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
target/classes/abc.txt
per 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.
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!)
new File(resource.toURI()).getAbsolutePath();
(cioè non penso che tu abbia bisogno dell'oggetto Path?)
new File(YourClass.class.getResource("abc").toURI().getPath())
se lo desideri.
.getResource("/abc")
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);
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
Ci sono due problemi sulla nostra strada verso il percorso assoluto:
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 src
osrc/test/resource
qui.
Puoi inserire il codice nel tuo e vedere i percorsi che hai.