13

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

4

8 回答 8

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

这会给你

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

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

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

记住:

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

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

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

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

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

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

如果在一个罐子里会给你一些在 unix 或 windows 中这样的东西

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

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

现在要解析这个,你可以查找你的类名并删除 / 或 \ 直到你得到你想要的路径。字符串 lastIndexOf 会有所帮助

于 2013-06-10T15:43:16.643 回答
3

您可以使用 :

URL classURL = getClass().getProtectionDomain().getCodeSource().getLocation();
于 2013-06-10T15:37:40.847 回答
1
ClassLoader loader = Test.class.getClassLoader();
System.out.println(loader.getResource("Test.class"));

Test.class.getProtectionDomain().getCodeSource().getLocation().getPath());
于 2013-06-10T15:38:29.007 回答
1

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

package com.putable;

public class MyClass{}

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

于 2013-06-10T15:38:59.323 回答
0

尝试使用此代码

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

访问链接以获取更多信息 查找从哪里加载 java 类

于 2013-06-10T15:55:32.860 回答
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());

    }

}
于 2013-06-10T15:37:30.237 回答
0

打印出类路径中文件的绝对路径,即 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());

    }

}
于 2016-06-08T22:58:07.993 回答
0

因为您在 * .jar文件中使用了 class.getResource(filePath).getpath() 。所以路径包括“!” . 如果要获取 *.jar 文件中的文件内容,请使用以下代码:

MyClass.class.getResourceAsStream("/path/fileName")
于 2021-08-23T08:12:50.953 回答