this.getClass()。getResource(“”)。getPath()返回错误的路径

时间:2013-06-10 15:32:42

标签: java classloader filepath

我目前正在为我的计算机科学决赛制作一个简单的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,它源于getClassLoader()返回null的事实,尽管我在Eclipse IDE上工作。任何想法?

7 个答案:

答案 0 :(得分:8)

如果你想在与代码相同的路径中加载文件,那么我建议你把它放在与代码相同的根文件夹中,而不是与类相同的路径。

原因:类可以放在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);

这会给你

  

name TstPath.class   文件:/java/Projects/tests3b/build/classes/s/TstPath.class

这是我的eclipse构建路径......

需要解析它以获取加载类的路径。

记住:

  1. App可以从其他地方开始
  2. 类可以在jar中然后路径会不同(将指向一个jar和文件里面的
  3. 类路径在运行时可以很多,而点1
  4. 一个类可能在运行时通过网络/代理/注入等进行,因此没有文件源,因此这不是一般的解决方案。
  5. 想想你想要在更高层次上实现什么并发布这个问题。意思是为什么你想要这条路?
  6. 您想要应用路径: -

    文件f =新文件(“./”);
     f.getCanonicalPath(); // ...

  7. 因此,可以从文件夹c:\ app1 \ run \

    启动应用程序

    jar可以在c:\ app1 \ libsMain \ myapp.jar

    和辅助jar可以在c:\ commonlibs \ set1

    所以这只会告诉你JVM在哪里找到你的课程,这可能是也可能不是你需要的。

    如果在jar中你会在unix或windows中给你一些这样的东西

      

    罐:文件:C:\应用\ my.jar /s/TstPath.class

    如果包是s并且类是TstPath,那么你可以确定这将会起作用,因为类必须在那里......

    现在解析这个你可以找到你的类名并删除/或\直到你得到你想要的路径。 String lastIndexOf将帮助

答案 1 :(得分:3)

您可以使用:

URL classURL = getClass().getProtectionDomain().getCodeSource().getLocation();

答案 2 :(得分:1)

ClassLoader loader = Test.class.getClassLoader();
System.out.println(loader.getResource("Test.class"));

Test.class.getProtectionDomain().getCodeSource().getLocation().getPath());

答案 3 :(得分:1)

getResource([String])的调用需要一个相对于包含调用它的类的文件夹的路径。因此,如果您有以下内容,则传递到MyClass.class.getResource([path]);的任何内容都必须是相对于com/putable/包文件夹的有效路径,并且必须指向真实文件:

package com.putable;

public class MyClass{}

使用空字符串无效,因为永远不会有一个等于空字符串的文件名。但是,你可以做getResource(getClass().getSimpleName())。只需从该调用返回的路径末尾删除文件名,您就可以拥有所需的类目录。

答案 4 :(得分:0)

试试这个。

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

    }

}

答案 5 :(得分:0)

尝试使用此代码

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

访问该链接以获取更多信息 Find where java class is loaded from

答案 6 :(得分:0)

在类路径中打印文件的绝对路径,即build / resources / main / someFileInClassPath.txt免责声明,这类似于此页面上使用TT.class的另一个解决方案...,但这对我不起作用相反,TT..getClassLoader()......确实对我有用。

undefined