2013-08-05 27 views
14

プロパティファイルをロードしようとしています。ここに私の構造は、今私はtest.propertiesファイルをロードしようとしていますgetResourceAsStream()はnullを返します。プロパティファイルがロードされていません

Directory Structure

です。しかし、私はnullになっています。ここではどのように私は

public class Test { 

    String workingDir = System.getProperty("user.dir"); 
    System.out.println("Current working directory : " + workingDir); 

    File temp = new File(workingDir + "\\" + "test.properties"); 
    String absolutePath = temp.getAbsolutePath(); 
    System.out.println("File path : " + absolutePath); 

    Properties properties = null; 

    try { 
     properties = new Properties(); 
     InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream(absolutePath); 
     if (resourceAsStream != null) { 
      properties.load(resourceAsStream); 
     } 


    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.exit(0); 

} //end of class Test 

このプログラムプリント

Current working directory : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration 
File path : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties 

をしています。しかし、性質がこのパスからファイルをロードしていません。そこには存在しますが。なぜ私はnullになっていますか?

おかげ

編集--- ----------------------------

String workingDir = System.getProperty("user.dir"); 
System.out.println("Current working directory : " + workingDir); 

File temp = new File(workingDir, "test.properties"); 

String absolutePath = temp.getAbsolutePath(); 
System.out.println("File path : " + absolutePath); 

try { 
    properties = new Properties(); 
    InputStream resourceAsStream = new FileInputStream(temp); 
    if (resourceAsStream != null) { 
     properties.load(resourceAsStream); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

System.exit(0); 

Current working directory : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration 
File path : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties 
java.io.FileNotFoundException: D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties (The system cannot find the file specified) 
at java.io.FileInputStream.open(Native Method) 
at java.io.FileInputStream.<init>(Unknown Source) 
at com.softech.ls360.integration.BatchImport.main(BatchImport.java:57) 

答えて

22

ああああ...ここにいくつかの問題があります。これは確かに良い決定です。しかし、getResourceAsStreamメソッドには "クラスパス相対"の名前が必要です。あなたは絶対パスを提供しています。

2)2番目のコードスニペット(編集後)は、ファイル "D:... \ LS360BatchImportIntegration \ test.properties"を見つけることができません。あなたのスクリーンショットによると、ファイルは "D:... \ LS360AutomatedRegulatorsReportingService \ test.properties"である必要があります。これは別のディレクトリです。

あなたの説明があなたのマシン上の調査結果に最新ではないことを心配します。

しかし、ちょうど合理的な解決策に移動してみましょう:あなたと同じ深さに「リソース」という名前の新しいディレクトリを作成し、(スクリーンショットは、Eclipseを使用していること、を教えてくれる)Eclipseのプロジェクトで)

1 "src"ディレクトリ。プロパティーファイルをコピーしたり、移動したりしてください。

2)この新しいディレクトリは、「ビルドパス」に配置する必要があります。パッケージエクスプローラまたはプロジェクトエクスプローラビューのディレクトリを右クリックし、[ビルドパス]、[ソースフォルダとして使用]を選択します。注:このビルドパスは、プロジェクトを実行するときのプロジェクトのクラスパスになります。

3)リソースディレクトリがクラスパスの一部で、プロパティファイルが含まれているため、単にgetResourceAsStream("test.properties")でロードすることができます。

EDIT

私はちょうどあなたがまた、Mavenの(pom.xmlファイル)を使用することを参照してください。 Mavenでは、デフォルトでこのようなリソースディレクトリが存在し、ビルドパスの一部です。これは "src/main/resources"です。もしそうなら、これを使ってください。

+0

はい私は 'test.proeprties'ファイルを間違った場所にコピーしています。正しい場所に置いた後、ストリームからロードしています:)。はい、私はmavenを使用しています。プロパティファイルを 'src/main/resources'フォルダに移動することを意味します。そしてあなたが言ったように(クラス2)、右クリックして 'src/main/resources'フォルダをクラスパスに追加しますか? – Basit

+0

'src/main/resources'はすでにクラスパス上にあると思います。 – Basit

+0

@Basit:まさに。 "src/main/resources"は、そのようなリソースのMavenのデフォルトディレクトリです。 Mavenを使用してアプリケーションをパッケージ化すると、自動的に考慮されます(そしてJARの一部になります)。 Eclipseでプロジェクトを実行すると、M2Eプラグインがそれを処理します。 – Seelenvirtuose

0

あなたはファイルがクラスパス上にあることを確認し、またはその代わりにFileInputStreamを使用することができます...

をあなたはgetResourceAsStream(String name)にファイルパスを渡しているが、ここでnameは、クラスパスではなく、ファイルのパスです。

8

絶対パスを使用しているのに対し、クラスローダー(クラスパスを読み込みます)を使用しています。

は単純にしてみてください:

InputStream resourceAsStream = new FileInputStream(temp); 

注意点として、やってあなたのファイルをinstanciatingてみてください。

File temp = new File(workingDir, "test.properties"); 

はシステム依存パスspearatorを使用します。

1)あなたの最初の提供のコードスニペットでは、リソースファイルをロードするためのClassLoaderを使用している、:

+1

例外が発生しています。なぜファイルが見つかりませんでしたか?ここで私はこの 'InputStream resourceAsStream = new FileInputStream(temp);'を使いました。プロパティファイルが存在します。あなたは出力でそれを見ることができます...? – Basit

+0

私の編集を確認してください。 – Basit

+0

実際には、あなたの '' workingDir''はプロパティを含んでいません!あなたのプロパティは '' LS360AutomatedRegulatorsReportingService''にありますが、コードは '' LS360BatchImportIntegration''を返します –

5

プロパティファイルを/ src/main/resourcesフォルダに置き、ClassLoaderからロードしてください。修正されます。

/src/main/resources/test.properties 



Properties properties = null; 

try { 
    properties = new Properties(); 
    InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("test.properties"); 
    if (resourceAsStream != null) { 
     properties.load(resourceAsStream); 
    } 


} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

OK、リソースフォルダを入れた後、 'InputStream resourceAsStream = \t BatchImport.class.getResourceAsStream(" test.properties ");'を使用してください。それは...ですか ? – Basit

+0

はい、クラスパス内のClassLoader検索ファイルになります –

0

ように私はgetResourceAsStream()によって発見されていないファイルと同様の問題がありました。ファイルはリソースフォルダ(src/main/resources)にありましたが、まだ見つかりません。

Eclipseエクスプローラに入り、リソースフォルダを「リフレッシュ」すると問題が解決しました。ディレクトリ内にありましたが、フォルダが更新されるまで(フォルダを右クリックして「リフレッシュ」を選択する)、Eclipseはそれを表示しませんでした。

関連する問題