質問
私の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()
を得るために実際のパスが、このように動作しません。
わたしにはわかりませんかすとインストールを続行します。
解決
クラスローダではなく、あなたからローダーを取得しているクラスに相対パスを指定してください。たとえばます:
resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
他のヒント
私はgetClass().getResource("filename.txt")
メソッドを使用しての問題点がありました。
あなたのリソースがあなたからリソースにアクセスしようとしているクラスと同じパッケージ内にない場合はJavaのドキュメントの指示を読めば、あなたはそれを'/'
で始まる相対パスを与える必要があります。推奨される戦略は、ルートディレクトリに「リソース」フォルダの下に、あなたのリソースファイルを置くことです。だから、例えば、あなたが構造を持っている場合:
src/main/com/mycompany/myapp
で達人で推奨されているように、あなたは、リソースのフォルダを追加することができます:
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"
の追加の情報を提供者になりすとその他で、そういったを提供私のシナリオでは、少しニュアンスが異な設定します。私のプロジェクト設定は以下のディレクトリ構造を利用Eclipse):
Project/ src/ // application source code org/ myproject/ MyClass.java test/ // unit tests res/ // resources images/ // PNG images for icons my-image.png xml/ // XSD files for validating XML files with JAXB my-schema.xsd conf/ // default .conf file for Log4j log4j.conf lib/ // libraries added to build-path via project settings
しかし問題荷私からの資源の res ディレクトリです。たいと思った全ての資源は別に、私のソースコード(ただけで管理/組織の目的のでは、どういった追加の res ディレクトリに ビルドパス そのディレクトリへのアクセスを許via:
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");
注意: の /
を省略してからの初めの文字列で使用してい ClassLoader.getResource(String) の代わりに クラスです。getResource(String).
@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);
、相対パスを使用すると、クラスローダに「のgetResource」を使用すると、相対パスがルートフォルダに基づいて解決される。クラスが含まれているパッケージに基づいて解決されます。
あなたは絶対パスを使用する場合は、、「の両方のgetResource」メソッドは、ルートフォルダから開始されます。
日食+ Mavenを使用してそれらのために。あなたはimages/pic.jpg
でファイルsrc/main/resources
にアクセスしようとします。このようにそれをやってます:
ClassLoader loader = MyClass.class.getClassLoader();
File file = new File(loader.getResource("images/pic.jpg").getFile());
完全に正確であるが、ヌル・ポインタ例外をもたらし得ます。日食は、すぐに元のフォルダとしてMavenのディレクトリ構造内のフォルダを認識しないように思えます。削除し、プロジェクトのソースフォルダのリストからsrc/main/resources
フォルダとバック(プロジェクト>プロパティ> Javaのビルド・パス>ソース>フォルダを追加/削除する)それを置くことによって、私はこの問題を解決することができました。
resourcesloader.class.getClass()
に分けることができます:
Class<resourcesloader> clazz = resourceloader.class;
Class<Class> classClass = clazz.getClass();
あなたは、ブートストラップクラスを使用してリソースをロードしようとしていることを意味します。
代わりに、あなたはおそらくのような何かをしたいです
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()
唯一のjavacが...非静的コンテキストに静的メソッドを呼び出すことについて警告した場合、
Doeの次の仕事?
resourcesloader.class.getClass().getResource("/package1/resources/repository/SSL-Key/cert.jks")
あなたはパッケージを含む完全なパスを指定することはできません理由はありますか?
上記のように2つの答えと一緒に行きます。最初の1
resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()
1と同じものになるでしょうか?
私は、nullポインタ例外を回避するために、およびデータディレクトリへのパスを設定(.getFile()
を追加することによって)の@ jonathan.coneの1つのライナーに小さな変更を行いました。ここでは私のために働いていたものです。
String realmID = new java.util.Scanner(new java.io.File(RandomDataGenerator.class.getClassLoader().getResource("data/aa-qa-id.csv").getFile().toString())).next();
これを使用します:
resourcesloader.class.getClassLoader().getResource("/path/to/file").**getPath();**
ファイルへの実際のパスを得るために、あなたはこれを試すことができます
URL fileUrl = Resourceloader.class.getResource("resources/repository/SSL-Key/cert.jks");
String pathToClass = fileUrl.getPath;
Resourceloaderはここにクラス名です。 「リソース/リポジトリ/ SSLキー/ cert.jks」ファイルへの相対パスです。あなたは残りのフォルダ構造の残りの部分と./package1/javaであなたのguiclassを持っていた場合、あなたはので、相対パスを定義する規則の相対パスとして「../resources/repository/SSL-Key/cert.jks」を取るだろう。
あなたはBufferedReaderのを使用してファイルを読み込むことができます。この方法で。あなたがスペースや、あなたのパスにない英語のアルファベットから一部の文字を持っている場合、あなたが問題を取得すると、ファイルが見つからないので、ファイルへのパスを識別するための文字列を使用しないでください。
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(fileUrl.openStream()));