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.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();
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.
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 srcosrc/test/resource qui.
Puoi inserire il codice nel tuo e vedere i percorsi che hai.