【问题标题】:this.getClass().getResource("").getPath() returns an incorrect paththis.getClass().getResource("").getPath() 返回不正确的路径
【发布时间】:2013-06-06 07:47:42
【问题描述】:

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

【问题讨论】:

  • 为什么不把类名传给getResource()
  • “当前运行类的路径”在 Java 中没有明确定义(可能是 URL,但也可能完全来自内存,因此不可能有路径)。这听起来像a XY problem。您实际上想解决什么问题?
  • 确实,对于您错误地认为问题中所述的解决方案将是正确的解决方案的根本问题,您肯定需要寻找不同的解决方案。特定的解决方案毫无意义,即使它在特定情况下工作,它也会使您的应用程序完全不可移植(即它在系统 X 中运行,但不在 Y、Z 等系统中运行)。我 java.util.prefs.Preferences 是您最终需要的。迄今为止发布的所有继续这个愚蠢解决方案的答案都是天真的。我建议忽略它们。
  • @Joachim Sauer 我正在尝试访问与类文件位于同一文件夹中的数据文件夹。因此,我需要获取当前运行类的路径。
  • @user2465495:如果你想从类路径中读取数据,你应该通过getResource()直接使用它,而不是使用File API(因为在部署中,您的类和资源通常不是文件(例如,ZIP 文件中的条目)。

标签: java classloader filepath


【解决方案1】:

试试这个。

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

    }

}

【讨论】:

    【解决方案2】:

    你可以使用:

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

    【讨论】:

      【解决方案3】:
      ClassLoader loader = Test.class.getClassLoader();
      System.out.println(loader.getResource("Test.class"));
      

      还有

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

      【讨论】:

        【解决方案4】:

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

        package com.putable;
        
        public class MyClass{}
        

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

        【讨论】:

          【解决方案5】:

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

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

          还建议您查看 cmets 中建议的首选项类: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 在哪里找到你的类,这可能是也可能不是你需要的。

          如果在 jar 中会在 unix 或 windows 中为您提供类似的东西

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

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

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

          【讨论】:

            【解决方案6】:

            尝试使用此代码

            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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 请不要复制粘贴答案,这个确切的答案没有被接受的事实是因为它没有解释为什么它会起作用。重复它不添加解释几乎是垃圾邮件的级别。请编辑您的答案
              • 我不认为这是副本。有一个根本的区别,旧的解决方案是“ TT.class.getResource("").getPath();"这对我不起作用。我不得不将 TT.class 更改为 TT.getClassLoader()。
              【解决方案8】:

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

              MyClass.class.getResourceAsStream("/path/fileName")
              

              【讨论】:

                猜你喜欢
                • 2015-06-03
                • 2023-03-21
                • 1970-01-01
                • 2011-12-20
                • 1970-01-01
                • 2011-04-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多