2017-12-04 6 views
2

Ich versuche, den vollständigen Dateipfad einer Ressource in einem Java-Projekt zu erhalten, das mir gegeben wurde. Der Code kann die Datei nicht finden, indem nur der Dateiname verwendet wird. Ich brauche Hilfe, damit es funktioniert.Ressourcen können nicht vom Threadkontextklassenlader geladen werden?

Dies ist die Projektstruktur:

enter image description here

Dies ist der Code:

package com.testing.software.apps; 

public class FileTest { 

    public static void main(String[]args) { 
     String fileName = "orders-2017.txt"; 
     String filePath = getFilePath(fileName); 
     System.out.println("File path is: " + filePath); 
    } 

    public static String getFilePath(String fileName) { 
     String fullFilepath = Thread.currentThread(). 
       getContextClassLoader(). 
       getResource(fileName). 
       getPath(); 
     return fullFilepath; 
    } 

} 

Dieser Code wirft eine Null-Zeiger Ausnahme in der "getPath();" Linie. Ich fand heraus, dass die Ausnahme auftritt, weil diese Zeile "getResource (fileName)" ein Null-URL-Objekt zurückgibt. Nach dem Überprüfen des getResource-Codes sehe ich schließlich "url = findResource (name);" gibt null zurück.

public URL getResource(String name) { 
    URL url; 
    if (parent != null) { 
     url = parent.getResource(name); 
    } else { 
     url = getBootstrapResource(name); 
    } 
    if (url == null) { 
     url = findResource(name); 
    } 
    return url; 
} 

bei der Definition der Suche von java.net.URL Findresource, ich sehe, dass es sich dabei immer null zurück, mir ein Null-die ganze Zeit zu geben.

protected URL findResource(String name) { 
    return null; 
} 

Kann jemand bitte erklären, warum dieser Code immer null geben landet und wie kann ich es die Datei, indem nur die Dateinamen machen findet Verwendung?

Antwort

2

ClassLoader ist eine abstrakte Klasse. Die Methode findResource gibt in der Standardimplementierung null zurück. Zur Laufzeit sollte die Implementierung dieser Klasse verwendet werden, die diese Methode überschreibt.

/** 
    * Finds the resource with the given name. Class loader implementations 
    * should override this method to specify where to find resources. 
    * 
    * @param name 
    *   The resource name 
    * 
    * @return A <tt>URL</tt> object for reading the resource, or 
    *   <tt>null</tt> if the resource could not be found 
    * 
    * @since 1.2 
    */ 
    protected URL findResource(String name) { 
     return null; 
    } 

Sie erhalten Fehler, weil Sie falschen Pfad verwenden. Sie sollten Verzeichnisse hinzufügen, da die Methode nicht rekursiv über das Ressourcenverzeichnis ausgeführt wird. Versuchen Sie es mit fileName = "text-files/orders/orders-2017.txt";

Wenn Sie die Default-Pfadpfadkonfiguration verwenden und diese Ressource in der Hauptfunktion verwenden möchten, sollten Sie sie nach src/main/resources verschieben.

Wenn Sie sie in src/test/java aufbewahren möchten, sind sie nur in Klassen verfügbar, die sich im Verzeichnis src/test/java befinden.

+1

Weiterführende Informationen https://maven.apache.org/plugins/maven-resources-plugin/ – Luk

+0

Ist der Code in meinem Beitrag eine gute, plattformunabhängige Möglichkeit, Dateien innerhalb eines Projekts zu finden, oder gibt es einen besseren Ansatz? Ich habe versucht, gepufferten Leser zu verwenden, wie in Beispiel 2 hier gezeigt. https://www.mkyong.com/java/java-read-a-text-file-line-by-line/ Ich benutzte den Dateipfad = ". \\ src \ test \\ resources \\ text-files \ \ orders \\ orders-2017.txt "und es funktioniert gut und es gibt keinen Nullzeiger. Aber ich bin mir nicht sicher, ob dieser Ansatz besser ist. Bitte beraten. Vielen Dank. – testerjoe2

+1

Sie können einfach Paths.get ("text-files/orders/orders-2017.txt") verwenden, um Pfadobjekt zu erhalten. Ich empfehle, mehr über Path-Klasse in Java zu lesen. Maven sucht nach der Datei im Standardspeicherort src/main/resources für regulären Code und src/test/resources für Testfälle. – Luk

Verwandte Themen