2017-12-04 14 views
2

私に与えられたJavaプロジェクトのリソースの完全なファイルパスを取得しようとしています。コードでは、ファイル名のみを使用してファイルを見つけることができません。私はそれを働かせるために助けが必要です。スレッドコンテキストクラスローダーからリソースを読み込めませんか?

これは、プロジェクトの構造である:

enter image description here

これはコードある:

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; 
    } 

} 

このコードはでヌルポインタ例外スロー "ある、getPathを();"ライン。私は、この行 "getResource(fileName)"がnull URLオブジェクトを返すため、例外が発生していることがわかりました。 getResourceコードを調べると、私は最終的に "url = findResource(name);" nullを返します。 java.net.URLにfindResourceの定義を見てみると

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; 
} 

、私はそれは常に、それによって私のすべての時間をヌルを与え、nullを返していることがわかります。

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

このコードは常にnull与えてしまい、なぜ誰かが説明していただけますとどのように私はそれがファイル名のみを使用してファイルを見つけることができますか?

答えて

2

ClassLoaderは抽象クラスです。 findResourceメソッドは、デフォルトの実装ではnullを返します。実行時には、このメソッドをオーバーライドするこのクラスを使用して実装する必要があります。

/** 
    * 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; 
    } 

誤ったパスを使用しているため、エラーが発生します。メソッドがリソースディレクトリを再帰的に移動しないため、ディレクトリを追加する必要があります。 fileName = "text-files/orders/orders-2017.txt"で試してください。

デフォルトのmavenパス設定を使用していて、このリソースをmain関数で使用する場合は、src/main/resourcesに移動する必要があります。

src/test/javaに保存したい場合は、src/test/javaディレクトリにあるクラスからのみ使用できます。

+1

続きを読むhttps://maven.apache.org/plugins/maven-resources-plugin/ – Luk

+0

私の投稿のコードは、プロジェクト内のファイルを見つけるためのプラットフォームに依存しない良い方法ですか、それとも良い方法がありますか?私はここで例2に示すようにバッファリングされたリーダーを使用しようとしました。 https://www.mkyong.com/java/java-read-a-text-file-line-by-line/ファイルパス= "。\\ src \ test \\ resources \\ text-files \ \ orders \\ orders-2017.txt "それはうまく動作し、ヌルポインタがありません。しかし、このアプローチがより良いかどうかはわかりません。お知らせ下さい。ありがとうございました。 – testerjoe2

+1

Paths.get( "text-files/orders/orders-2017.txt")を使用してパスオブジェクトを取得できます。 javaのPathクラスについてもっと読むことをお勧めします。 Mavenは通常のコードではsrc/main/resources、テストケースではsrc/test/resourcesのデフォルトの場所にあるファイルを探します。 – Luk

関連する問題