2016-03-28 3 views
0

プロジェクト・ファイル・システム:完璧に動作相対パスの明確化

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

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

私はそうのようなフォントを設定するプログラムを持っています。私が把握しようとしていることは、相対的な経路がどのように働いているかです。

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

しかし、それは罰金、私はポストの上でそれを持っているように動作します:動作するためにあなたはパスがあるべきだと思いますので、それでneuropol x rg.ttfファイルには、私のsrcフォルダに座っています。

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

この:このケースでは、私はフォントが作成され、右下の次の行を挿入することで確認している私のプロジェクトフォルダ、相対パスであるルートがどこコードが実行されてからしなければならない私の理解、へlineはプロジェクトフォルダを返します。だから、srcフォルダをパスに追加しないとどうして動いてきますか?私は相対的な経路の根がどこにあるのか混乱していますか?

+0

あなたのコードがコンパイルされると、 'src /'フォルダはもはや存在しません。 –

答えて

3

方法getResourceAsStream()リソース、ないファイルを開きます。例として、あなたは、パッケージ名を持っている場合。リソースはディレクトリ内のファイルでもかまいませんが、jarファイル内のエントリまたはJVMがリソースを見つけることができる他の場所であってもかまいません。 javadocは、JVMが指定されたリソースの検索をどのように実行するかについて説明します。

重要な点は、リソース名が現在の作業ディレクトリではなく、CLASSPATHに関連していることです。そのため、あなたがファイルを開くことになっていたとしても( 'new FileInputStream(...) `など)、パスを'/src 'の前に置くことはできません。ただし、プログラムがプロジェクトソースから実行されているときだけですディレクトリ(ただし、ユーザーのコンピュータにインストールされていない場合)。

+0

両方の素晴らしい答え。ありがとう! – user3226170

2

srcは、プロジェクトのパッケージ構造に過ぎず、コンパイル時には含まれません。 (Default package)は、/yourFont.ttfを使用するパッケージ名がないとどうなりますか?

-----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")