web-dev-qa-db-ja.com

this.getClass()。getResource( "")。getPath()は誤ったパスを返します

現在、コンピューターサイエンスファイナル用の簡単な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を返すことに起因しています。何か案は?

11
user2465495

コードと同じパスにファイルをロードする場合は、クラスと同じパスではなく、コードと同じルートフォルダーにファイルを配置することをお勧めします。

理由:クラスは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ビルドパスです...

これを解析して、クラスがロードされたパスを取得する必要があります。

覚えておいてください:

  1. アプリは他の場所から起動できます
  2. クラスはjarに入れることができ、パスは異なります(その中のjarとファイルを指します)
  3. クラスパスは実行時およびポイント1で多くなる可能性があります1
  4. クラスは、実行時にネットワーク/プロキシ/インジェクションなどを介して作成される可能性があり、したがってファイルソースがないため、これは一般的なソリューションではありません。
  5. より高いレベルで達成したいことを考え、その質問を投稿してください。なぜこのパスが必要なのですか?
  6. アプリのパスが必要ですか:-

    ファイル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が役立ちます

8
tgkprog

以下を使用できます。

URL classURL = getClass().getProtectionDomain().getCodeSource().getLocation();
3
NINCOMPOOP
ClassLoader loader = Test.class.getClassLoader();
System.out.println(loader.getResource("Test.class"));

また

Test.class.getProtectionDomain().getCodeSource().getLocation().getPath());
1
Alpesh Gediya

getResource([String])の呼び出しには、呼び出し元のクラスを含むフォルダーへの相対パスが必要です。したがって、次のものがある場合、MyClass.class.getResource([path]);に渡すものはすべて、_com/putable/_パッケージフォルダーに対する相対パスであり、実際のファイルを指している必要があります。

_package com.putable;

public class MyClass{}
_

空の文字列を使用することは、空の文字列に等しいファイル名が存在することはないため、単に無効です。ただし、getResource(getClass().getSimpleName())を実行できます。その呼び出しによって返されたパスの末尾からファイル名を削除するだけで、目的のクラスディレクトリが得られます。

1
CodeBlind

これを試して。

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());

    }

}
0
Makky

クラスパス内のファイルの絶対パス、つまり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());

    }

}
0
shane

このコードを使用してみてください

public game()
{  
    String className = this.getClass().getSimpleName();  
    String testPath = this.getClass().getResource(className+".class");  
    System.out.println("Current Running Location is :"+testPath);   
}

詳細については、リンクを参照してください Javaクラスのロード元 を検索)==

0
Prabhaker