在java中用相对path打开资源

在我的Java应用程序,我需要得到一些文件和目录。

这是程序结构:

./main.java ./package1/guiclass.java ./package1/resources/resourcesloader.java ./package1/resources/repository/modules/ -> this is the dir I need to get ./package1/resources/repository/SSL-Key/cert.jks -> this is the file I need to get 

guiclass加载将加载我的资源(目录和文件)的resourcesloader类。

关于这个文件,我试了一下

 resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString() 

为了得到真正的道路,但这种方式是行不通的…

关于目录我不知道该怎么做…

build议? 谢谢。

提供相对于类加载器的path,而不是从中获取加载器的类。 例如:

 resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString(); 

我有使用getClass().getResource("filename.txt")方法的问题。 在阅读了Java文档说明之后,如果你的资源与你试图访问资源的类不在同一个包中,那么你必须给它以'/'开始的相对path。 build议的策略是将您的资源文件放在根目录下的“resources”文件夹下。 所以例如,如果你有这样的结构:

 src/main/com/mycompany/myapp 

那么你可以添加一个资源文件夹,按照maven的build议:

 src/main/resources 

此外,您可以在资源文件夹中添加子文件夹

 src/main/resources/textfiles 

并说你的文件被称为myfile.txt所以你有

 src/main/resources/textfiles/myfile.txt 

现在这里是愚蠢的path问题的地方。假设你的com.mycompany.myapp package有一个类,并且你想从资源文件夹访问myfile.txt文件。 有人说你需要给:

 "/main/resources/textfiles/myfile.txt" path 

要么

 "/resources/textfiles/myfile.txt" 

这两个都是错误的。 在我运行mvn clean compile ,文件和文件夹被复制到:

 myapp/target/classes 

夹。 但资源文件夹不在那里,只是资源文件夹中的文件夹。 所以你有:

 myapp/target/classes/textfiles/myfile.txt myapp/target/classes/com/mycompany/myapp/* 

所以给getClass().getResource("")方法的正确path是:

 "/textfiles/myfile.txt" 

这里是:

 getClass().getResource("/textfiles/myfile.txt") 

这将不再返回null,但会返回你的类。 我希望这有助于某人。 我很奇怪, "resources"文件夹也没有被复制,而只是直接在"resources"文件夹中的子文件夹和文件。 在我看来, "resources"文件夹也可以在"myapp/target/classes"下find,

为了给那些不像其他人那样快速提供更多信息的人提供更多的信息,我想提供我的场景,因为它有一个稍微不同的设置。 我的项目安装了以下目录结构(使用Eclipse):

项目/
   src / //应用程序的源代码
    组织/
      我的项目/
         MyClass.java
  testing/ / /unit testing
   res / //资源
    图像/ / / PNG图像的图标
      我-image.png
    用于使用JAXBvalidationXML文件的xml / // XSD文件
      我-schema.xsd
     conf / / Log4j的默认.conf文件
       log4j.conf
   lib / //库通过项目设置添加到build-path

我遇到了从res目录加载我的资源的问题。 我希望我的所有资源都与源代码分开(仅用于pipe理/组织目的)。 所以,我必须做的是将res目录添加到构buildpath ,然后通过访问资源:

 static final ClassLoader loader = MyClass.class.getClassLoader(); // in some function loader.getResource("images/my-image.png"); loader.getResource("xml/my-schema.xsd"); loader.getResource("conf/log4j.conf"); 

注意: /从资源string的开头省略,因为我正在使用ClassLoader.getResource(String)而不是Class.getResource(String) 。

当在一个类上使用“getResource”时,将根据该类所在的包来parsing相对path。在ClassLoader上使用“getResource”时,会根据根文件夹parsing相对path。

如果使用绝对path,那么“getResource”方法将从根文件夹开始。

@GianCarlo:你可以尝试调用System属性user.dir,它会给你的Java项目的根,然后将这个path附加到你的相对path,例如:

 String root = System.getProperty("user.dir"); String filepath = "/path/to/yourfile.txt"; // in case of Windows: "\\path \\to\\yourfile.txt String abspath = root+filepath; // using above path read your file into byte [] File file = new File(abspath); FileInputStream fis = new FileInputStream(file); byte []filebytes = new byte[(int)file.length()]; fis.read(filebytes); 

对于那些使用eclipse + maven。 假设您尝试访问src/main/resources的文件images/pic.jpg 。 这样做:

 ClassLoader loader = MyClass.class.getClassLoader(); File file = new File(loader.getResource("images/pic.jpg").getFile()); 

是完全正确的,但可能会导致空指针exception。 看起来像eclipse不能马上识别maven目录结构中的文件夹作为源文件夹。 通过从项目的源文件夹列表中删除和src/main/resources文件夹并将其放回(项目>属性> Java构buildpath>源>删除/添加文件夹),我能够解决这个问题。

 resourcesloader.class.getClass() 

可以细分为:

 Class<resourcesloader> clazz = resourceloader.class; Class<Class> classClass = clazz.getClass(); 

这意味着您正尝试使用引导类加载资源。

相反,你可能想要这样的东西:

 resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString() 

如果只有javac警告在非静态上下文中调用静态方法…

Doe以下工作?

 resourcesloader.class.getClass().getResource("/package1/resources/repository/SSL-Key/cert.jks") 

是否有一个原因,你不能指定包括包的完整path?

用上面提到的两个答案。 第一个

 resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString(); resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString() 

应该是同一件事?

我在@ jonathan.cone的一个class轮(通过添加.getFile() )做了一个小修改,以避免空指针exception,并设置数据目录的path。 以下是对我有用的东西:

 String realmID = new java.util.Scanner(new java.io.File(RandomDataGenerator.class.getClassLoader().getResource("data/aa-qa-id.csv").getFile().toString())).next(); 

用这个:

 resourcesloader.class.getClassLoader().getResource("/path/to/file").**getPath();**