89

私の Java アプリでは、いくつかのファイルとディレクトリを取得する必要があります。

これはプログラム構造です:

./main.java
./package1/guiclass.java
./package1/resources/resourcesloader.java
./package1/resources/repository/modules/   -> this is the dir I need to get
./package1/resources/repository/SSL-Key/cert.jks    -> this is the file I need to get

guiclassリソース (ディレクトリとファイル) をロードする resourcesloader クラスをロードします。

ファイルに関しては、試しました

resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()

実際のパスを取得するために、この方法は機能しません。

ディレクトリに使用するパスがわかりません。

4

13 に答える 13

175

getClass().getResource("filename.txt")メソッドの使用に問題がありました。Java ドキュメントの説明を読んだときに、リソースにアクセスしようとしているクラスと同じパッケージにリソースが含まれていない場合は、 で始まる相対パスを指定する必要があります'/'。推奨される戦略は、ルート ディレクトリの "resources" フォルダーにリソース ファイルを配置することです。たとえば、次のような構造の場合:

src/main/com/mycompany/myapp

次に、maven で推奨されているように、次のリソース フォルダーを追加できます。

src/main/resources

さらに、リソースフォルダーにサブフォルダーを追加できます

src/main/resources/textfiles

そして、あなたのファイルが呼び出されていると言いmyfile.txtます

src/main/resources/textfiles/myfile.txt

ここで、ばかげたパスの問題が発生します。 にクラスがあり、リソース フォルダーからファイルcom.mycompany.myapp packageにアクセスしたいとします。myfile.txt次のものを与える必要があると言う人もいます:

"/main/resources/textfiles/myfile.txt" path

また

"/resources/textfiles/myfile.txt"

これらは両方とも間違っています。を実行した後mvn clean compile、ファイルとフォルダーは次の場所にコピーされます。

myapp/target/classes 

フォルダ。ただし、リソース フォルダーは存在せず、リソース フォルダー内のフォルダーだけです。だからあなたは持っています:

myapp/target/classes/textfiles/myfile.txt

myapp/target/classes/com/mycompany/myapp/*

getClass().getResource("")したがって、メソッドに与える正しいパスは次のとおりです。

"/textfiles/myfile.txt"

ここにあります:

getClass().getResource("/textfiles/myfile.txt")

これは null を返しませんが、クラスを返します。これが誰かに役立つことを願っています。"resources"フォルダーもコピーされず、フォルダー内のサブフォルダーとファイルのみが直接コピーされるのは奇妙です"resources""resources"フォルダーが以下にもあることは私には論理的に思えます"myapp/target/classes"

于 2010-01-20T17:50:45.087 に答える
50

ローダーを取得するクラスではなく、クラスローダーに対する相対パスを指定します。例えば:

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
于 2009-02-21T20:46:13.220 に答える
36

これを他の人ほど早く理解していない人に追加情報を提供することを期待して、セットアップが少し異なるため、シナリオを提供したいと思います. 私のプロジェクトは、次のディレクトリ構造でセットアップされました(Eclipseを使用):

計画/
  src/ // アプリケーションのソースコード
    組織/
      私のプロジェクト/
        MyClass.java
  test/ // 単体テスト
  res/ // リソース
    images/ // アイコンの PNG 画像
      私の画像.png
    xml/ // JAXB で XML ファイルを検証するための XSD ファイル
      私のスキーマ.xsd
    conf/ // Log4j のデフォルトの .conf ファイル
      log4j.conf
  lib/ // プロジェクト設定を介してビルドパスに追加されたライブラリ

リソースをresディレクトリからロードする際に問題が発生しました。すべてのリソースをソース コードから分離したかった (単に管理/組織の目的で)。したがって、私がしなければならなかったのは、ビルドパスにresディレクトリを追加してから、次の方法でリソースにアクセスすることでした。

static final ClassLoader loader = MyClass.class.getClassLoader();

// in some function
loader.getResource("images/my-image.png");
loader.getResource("xml/my-schema.xsd");
loader.getResource("conf/log4j.conf");

注: Class.getResource(String )の代わりにClassLoader.getResource(String)を使用しているため、リソース文字列の/先頭から が省略されています 。

于 2011-06-20T19:08:49.483 に答える
10

@GianCarlo:Javaプロジェクトのルートを提供するシステムプロパティuser.dirを呼び出してから、このパスを相対パスに追加してみてください。例:

String root = System.getProperty("user.dir");
String filepath = "/path/to/yourfile.txt"; // in case of Windows: "\\path \\to\\yourfile.txt
String abspath = root+filepath;



// using above path read your file into byte []
File file = new File(abspath);
FileInputStream fis = new FileInputStream(file);
byte []filebytes = new byte[(int)file.length()];
fis.read(filebytes);
于 2010-10-21T00:27:34.897 に答える
10

クラスで「getResource」を使用すると、クラスが含まれるパッケージに基づいて相対パスが解決されます。ClassLoader で「getResource」を使用すると、ルート フォルダーに基づいて相対パスが解決されます。

絶対パスを使用すると、両方の「getResource」メソッドがルート フォルダーから開始されます。

于 2009-02-22T00:10:36.067 に答える
6

Eclipse + Maven を使用している方向け。のファイルimages/pic.jpgにアクセスしようとするとしますsrc/main/resources。このようにする:

ClassLoader loader = MyClass.class.getClassLoader();
File file = new File(loader.getResource("images/pic.jpg").getFile());

完全に正しいですが、null ポインター例外が発生する可能性があります。Eclipse は、Maven ディレクトリ構造内のフォルダーをソース フォルダーとしてすぐに認識しないようです。プロジェクトのソースフォルダーリストからフォルダーを削除してsrc/main/resources元に戻すことで(プロジェクト>プロパティ> Javaビルドパス>ソース>フォルダーの削除/追加)、これを解決できました。

于 2015-10-27T12:55:05.653 に答える
2
resourcesloader.class.getClass()

次のように分類できます。

Class<resourcesloader> clazz = resourceloader.class;
Class<Class> classClass = clazz.getClass();

これは、ブートストラップクラスを使用してリソースをロードしようとしていることを意味します。

代わりに、おそらく次のようなものが必要です。

resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()

javacだけが非静的コンテキストで静的メソッドを呼び出すことについて警告した場合...

于 2009-02-21T20:52:43.250 に答える
1

以下は機能しますか?

resourcesloader.class.getClass().getResource("/package1/resources/repository/SSL-Key/cert.jks")

パッケージを含めたフルパスを指定できない理由はありますか?

于 2009-02-21T20:45:44.873 に答える
1

上記の2つの答えを使用します。最初の1つ

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()

同じものであるべきですか?

于 2011-12-11T08:51:19.557 に答える
0

@jonathan.cone の 1 つのライナーに小さな変更を加え ( を追加して.getFile())、null ポインター例外を回避し、データ ディレクトリへのパスを設定しました。これが私のために働いたものです:

String realmID = new java.util.Scanner(new java.io.File(RandomDataGenerator.class.getClassLoader().getResource("data/aa-qa-id.csv").getFile().toString())).next();
于 2016-04-27T17:42:32.270 に答える