現在、コンピューターサイエンスファイナル用の簡単なJavaプログラムを作成しています。現在実行中のクラスのパスを取得する必要があります。クラスファイルはC:\ 2013\game \フォルダーにあります。 。
このパスを取得するには、メインクラスコンストラクターでこのコードセグメントを呼び出します。
public game(){
String testPath = this.getClass().getResource("").getPath();
//Rest of game
}
ただし、このコマンドは、代わりにこのストリングを返します。正しい出力が「C:/ 2013/game」であるにもかかわらず、「/」です。さらに、このコードを使用してこれを修正しようとしました。
public game(){
String testPath = this.getClass().getClassLoader().getResource("").getPath();
}
これはNullPointerExceptionを返します。これは、私のEclipse IDEで作業しているにもかかわらず、getClassLoader()がnullを返すことに起因しています。何か案は?
コードと同じパスにファイルをロードする場合は、クラスと同じパスではなく、コードと同じルートフォルダーにファイルを配置することをお勧めします。
理由:クラスはjar内にあり、データファイルは同じjarに入れることができますが、その場合は編集と更新がより難しくなります。
また、コメントで提案された設定クラスを参照することをお勧めします。 http://www.javacodegeeks.com/2011/09/use-javautilprefspreferences-instead-of.html 独自のデータ/ Excel/csv/Java.util.Propertiesファイルがあります
それがEclipseでなぜ機能しているのかはわかりませんが、コマンドプロンプト/ターミナルから実行することに集中することをお勧めします
あなたのクラスを求めることができます
String s = getClass().getName();
int i = s.lastIndexOf(".");
if(i > -1) s = s.substring(i + 1);
s = s + ".class";
System.out.println("name " +s);
Object testPath = this.getClass().getResource(s);
System.out.println(testPath);
これはあなたに与えます
名前TstPath.classファイル:/Java/Projects/tests3b/build/classes/s/TstPath.class
これは私のEclipseビルドパスです...
これを解析して、クラスがロードされたパスを取得する必要があります。
覚えておいてください:
アプリのパスが必要ですか:-
ファイルf = new File( "./");
f.getCanonicalPath(); // ...
したがって、フォルダーc:\ app1\run \からアプリを起動できます。
Jarはc:\ app1\libsMain\myapp.jarにあります。
ヘルパーjarはc:\ commonlibs\set1にあります
したがって、これは、JVMがクラスを見つけた場所のみを示し、必要な場合とそうでない場合があります。
jar内でunixまたはwindowsでこのようなことをする場合
jar:file:c:\ app\my.jar!/s/TstPath.class
パッケージがsでクラスがTstPathの場合、クラスがそこにある必要があるため、これが機能することを確認できます...
これを解析するために、クラス名を探し、必要なパスが得られるまで/または\を削除できます。文字列lastIndexOfが役立ちます
以下を使用できます。
URL classURL = getClass().getProtectionDomain().getCodeSource().getLocation();
ClassLoader loader = Test.class.getClassLoader();
System.out.println(loader.getResource("Test.class"));
また
Test.class.getProtectionDomain().getCodeSource().getLocation().getPath());
getResource([String])
の呼び出しには、呼び出し元のクラスを含むフォルダーへの相対パスが必要です。したがって、次のものがある場合、MyClass.class.getResource([path]);
に渡すものはすべて、_com/putable/
_パッケージフォルダーに対する相対パスであり、実際のファイルを指している必要があります。
_package com.putable;
public class MyClass{}
_
空の文字列を使用することは、空の文字列に等しいファイル名が存在することはないため、単に無効です。ただし、getResource(getClass().getSimpleName())
を実行できます。その呼び出しによって返されたパスの末尾からファイル名を削除するだけで、目的のクラスディレクトリが得られます。
これを試して。
import Java.io.File;
public class TT {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String path = TT.class.getResource("").getPath();
File file = new File(path);
System.out.println(file.getAbsolutePath());
}
}
クラスパス内のファイルの絶対パス、つまりbuild/resources/main/someFileInClassPath.txtを印刷してください。免責事項、これはTT.classを使用したこのページの別のソリューションに似ていますが、TTでは機能しませんでした。 .getClassLoader()...は私のために働いた。
import Java.io.File;
public class TT {
/**
* @param args
*/
public static void main(String[] args) {
String path = TT.getClassLoader().getResource("someFileInClassPath.txt").getPath();
File file = new File(path);
System.out.println(file.getAbsolutePath());
}
}
このコードを使用してみてください
public game()
{
String className = this.getClass().getSimpleName();
String testPath = this.getClass().getResource(className+".class");
System.out.println("Current Running Location is :"+testPath);
}
詳細については、リンクを参照してください Javaクラスのロード元 を検索)==