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