this.getClass().getResource(“”).getPath() 返回不正确的路径

2022-09-04 21:24:53

我目前正在为我的计算机科学Final制作一个小的简单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 上工作。有什么想法吗?


答案 1

如果要在与代码相同的路径中加载文件,那么我建议您将其放在与代码相同的根文件夹中,而不是与类相同的路径中。

原因:类可以在jar中,数据文件可以放在同一个jar中,但编辑和更新起来比较困难。

还建议您查看注释中建议的首选项类:http://www.javacodegeeks.com/2011/09/use-javautilprefspreferences-instead-of.html 尽管在某些情况下我认为拥有自己的data/ 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 file:/java/Projects/tests3b/build/classes/s/TstPath.class

这是我的日食构建路径...

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

记得:

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

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

因此,可以从文件夹 c:\app1\run\ 启动应用

jar 可能位于 c:\app1\libsMain\myapp.jar

和一个辅助罐可以在 c:\commonlibs\set1

因此,这只会告诉您JVM在哪里找到您的类,这可能是也可能不是您需要的。

如果在罐子里会给你一些类似的东西在unix或Windows中

jar:file:c:\app\my.jar!/s/TstPath.class

如果包是s,类是TstPath,你可以确定这将工作,因为类必须在那里......

现在要解析它,您可以查找您的类名并删除/ 或\,直到获得所需的路径。字符串 last索引将有所帮助


答案 2

您可以使用 :

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