2016-03-28 7 views
0

Projektdateisystem:Relative Pfad Klärung

Project 
| 
-----bin 
| 
-----.settings 
| 
-----src 
    | 
    -----(default package) 
      | 
      -----Main.Java 
      | 
      -----neuropol x rg.ttf 

Ich habe ein Programm, das eine Schriftart wie so setzt:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, 
     getClass().getResourceAsStream("/neuropol x rg.ttf"))); 

Welche perfekt funktionieren. Ich versuche herauszufinden, wie der relative Pfad funktioniert. So ist die neuropol x rg.ttf Datei in meinem src Ordner sitzen, so, um Sie arbeiten würde denken, dass der Weg sein sollte:

...getResourcesAsStream("/src/neuropol x rg.ttf") 

Aber es funktioniert gut, wie ich es an der Spitze der Post haben. Zu meinem Verständnis sollte die relative Pfade Wurzel, wo der Code aus ausgeführt wird, die in diesem Fall ist mein Projekt-Ordner, die ich durch das Einfügen der folgenden Zeile bestätigt haben, direkt unter dem die Schriftart erstellt:

System.out.println(System.getProperty("user.dir")); 

Diese line gibt den Projektordner zurück. Wie funktioniert es, ohne den Ordner src zum Pfad hinzuzufügen? Bin ich verwirrt, wo die Wurzel des relativen Pfades ist?

+0

Wenn Ihr Code kompiliert wurde, existiert der 'src /' Ordner nicht mehr. –

Antwort

3

Verfahren getResourceAsStream() öffnet eine Ressource, keine Datei. Die Ressource könnte eine Datei in einem Verzeichnis sein, aber sie könnte ein Eintrag in einer JAR-Datei oder an einem anderen Ort sein, an dem die JVM Ressourcen finden kann. Das Javadoc erläutert, wie die JVM die Suche nach der angegebenen Ressource durchführt.

Der entscheidende Punkt ist, dass der Ressourcenname relativ zum CLASSPATH ist, nicht zum Current Working Directory. Deshalb können Sie den Pfad nicht mit '/ src' voranstellen, wenn Sie jedoch eine Datei öffnen würden (zB 'new FileInputStream (...) `) würden Sie - aber nur, wenn das Programm von der Projektquelle aus ausgeführt wird Verzeichnis (nicht wenn es auf dem Computer eines Benutzers installiert ist).

+0

Beide tolle Antworten. Vielen Dank! – user3226170

2

src ist nur die Paketstruktur für das Projekt und ist nicht enthalten, wenn Sie kompilieren. (Default package) passiert, wenn Sie keinen Paketnamen haben, der Sie dazu veranlasst, /yourFont.ttf zu verwenden. Als Beispiel, wenn Sie einen Paketnamen haben:

-----src 
    | 
    -----yourpackage 
      |  
      -----neuropol x rg.ttf 
// This will become getResourceAsStream("/yourpackage/neuropol x rg.ttf") 

-----src 
    | 
    -----yourpackage 
      | 
      -----Main.java 
      |  
      -----fonts 
       | 
       -----neuropol x rg.ttf 
// This will become getResourceAsStream("/yourpackage/fonts/neuropol x rg.ttf")