2017-01-16 4 views
1

Ich verwende:Pfad funktioniert nicht; mit File.separator

  • jdk 1.8.0.71
  • IntelliJ 2016.3.2
  • Win7

ich neugierig war, warum dieser Weg nicht funktioniert:

public static final String ZPL_TEMPLATE = 
        File.separator 
        + "templates" 
        + File.separator 
        + "Template.txt"; 

noch dieses funktioniert gut:

public static final String TEMPLATE = "/templates/Template.txt"; 

Hier ist, wo verwendet wird (das in einem anderen Paket):

InputStream is = this.getClass().getResourceAsStream(TEMPLATE); 

EDIT: die Ausnahme:

... 
java.lang.NullPointerException: null 
    at java.io.Reader.<init>(Reader.java:78) 
    at java.io.InputStreamReader.<init>(InputStreamReader.java:72) 
    ... 
+0

Entschuldigung für die sehr dumme Frage, aber bist du sicher "/templates/ZPLTemplate.txt" existiert? Das Beispiel, das Sie als funktionierend angegeben haben, ist "/templates/Template.txt" ohne die ZPL. Einfach überprüfen. – phss

+0

Könnten Sie uns auch Details zu dem Fehler geben, den Sie bekommen? – phss

+0

versuchen Sie es mit 'FileSystems.getDefault(). GetSeparator();' – Jobin

Antwort

2

Wenn eine interne Ressource zugreifen, wie Sie mit getResouceAsStream tat, muss die Datei Separator / sein.

Ich glaube, dass Sie in einer Windows-Maschine sind, so dass der Dateitrenner \ ist.

Weitere Informationen finden Sie unter How to use file separator when loading resources.

+0

Der von Ihnen angegebene Link funktioniert nicht (zumindest nicht für mich) –

+0

Fixed. Es war ein extra Platz am Ende ... Danke, @ 4673_j – Zack

+0

Richtig .. Ich hatte auf eine Art Systemtrenner gehofft; aber ich denke, Einfachheit ist besser, ziemlich klar in dem Link zur Verfügung gestellt. Schrägstrich ist es dann. –

2

Becaseuse Datei Separator unter Win 7 '\' ist und wie es im Dokument für heißt getResourceAsStream

Vor der Delegierung wird unter Verwendung dieses Algorithmus ein absoluter Ressourcenname aus dem angegebenen Ressourcennamen erstellt:

Wenn der Name mit einem '/' ('\ u002f') beginnt, ist der absolute Name der Ressource der Abschnitt des Namens nach dem '/'. Andernfalls hat der absolute Name die folgende Form: modified_package_name/name Dabei steht der Name des geänderten Pakets für den Paketnamen dieses Objekts, wobei '/' für '.' ('\ u002e').

1

getResourceAsStream Erwarten Sie einen Ressourcennamen als Parameter, nicht als Dateipfad.

Ressourcen Name in Java von vorne getrennt sind schlitzt /, unabhängig von dem Dateisystem (Ressourcen Namen/Pfad einen Pfad auf dem Classpath darstellt, nicht auf dem Dateisystem).

Daher können Sie den Dateisystemtrenner nicht zum Erstellen des Ressourcennamens verwenden. Unter Windows wird es ein Backslash sein \

Verwandte Themen