2013-01-04 10 views
11

Wie würde ich den Namen einer Datei im Klassenpfad in einen echten Dateinamen konvertieren?Konvertieren eines Klassenpfaddateinamens in einen echten Dateinamen

Angenommen, das Verzeichnis "C:\workspace\project\target\classes" befindet sich in Ihrem Klassenpfad. In diesem Verzeichnis befindet sich eine Datei, z. B. info.properties.

Wie würden Sie (zur Laufzeit) den absoluten Dateipfad zur Datei info.properties ermitteln, vorausgesetzt, nur die Zeichenfolge "info.properties"? Das Ergebnis wäre etwas wie "C:\workspace\project\target\classes\info.properties".

Warum ist das nützlich? Beim Schreiben von Komponententests möchten Sie möglicherweise auf Dateien zugreifen, die in Ihren Testressourcen gebündelt sind (src/main/resources). Sie arbeiten jedoch mit einer Bibliothek eines Fremdanbieters oder einem anderen System, das einen echten Dateinamen und keine relative Klassenpfadreferenz erfordert.

Hinweis: Ich habe diese Frage selbst beantwortet, da ich finde, dass es ein nützlicher Trick ist, aber es sieht so aus, als ob niemand jemals diese Frage gestellt hat.

Antwort

16

eine Kombination aus ClassLoader.getResource() und URL.getFile()

URL url = Thread.currentThread().getContextClassLoader().getResource(resource); 
if(url == null){ 
    throw new RuntimeException("Cannot find resource on classpath: '" + resource + "'"); 
} 
String file = url.getFile(); 

Hinweis für Windows: in dem obigen Beispiel wird das tatsächliche Ergebnis

"/C:/workspace/project/target/classes/info.properties" 

werden, wenn Sie benötigen einen Windows-ähnlichen Pfad (z. B. "C:\workspace\..."), verwenden Sie:

String nativeFilename = new File(file).getPath(); 
+5

Was wird das produzieren, wenn die Ressource in einem Glas ist? – radai

+1

@radai Hier ist ein Beispiel für das Ergebnis einer Datei in einem Jar: 'file:/C: /tools/some/path/jarfile.jar!/Internal/path/file.txt'. Um eine solche Datei mit der obigen Antwort zu finden, müssen Sie einen Pfad relativ zum jar root angeben - d. '" internal/path/file.txt "' – GreenGiant

+0

@radai Überprüfen Sie auch [dies] (http://stackoverflow.com/questions/12025689/filenotfundedexception-when-exporting-jar/12025740#12025740) –