我想使用相对路径从我的src文件夹开始从资源文件夹中获取文件。
File myFile = new File("/src/main/resources/filefolder/file.xml");
当我尝试这个时:
File myFile = new File("../src/main/resources/filefolder/file.xml");
或者这个:
File myFile = new File("../../../../src/main/resources/filefolder/file.xml");
我明白了:
java.io.FileNotFoundException: /srv/../src/main/resources/filefolder/file.xml(No such file or directory)
我的文件结构:
-src
-main
-java
-com.my.site
-task
-MyClass.java
-resources
答案 0 :(得分:3)
您的路径是正确的,只需在src之前添加点,以表示您正在搜索项目根目录的相对路径,在其他情况下,您将按绝对路径搜索
File myFile = new File("./src/resources/filefolder/file.xml");
如果不起作用 - 试试这个:
File myFile = new File("src/resources/filefolder/file.xml");
无论如何你可以运行它来检查你的根目录是什么:
public static void main(String[] args) {
System.out.println(new File("").getAbsolutePath());
}
答案 1 :(得分:2)
我看到你问的是相对路径但似乎你只想从资源中读取文件,我相信最常见的读取资源的方法是使用类加载器,例如:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("filefolder/file.xml").getFile());
答案 2 :(得分:2)
只是一点点解释......你想要做的是从资源文件夹中获取资源,这是一项非常典型的任务。
你必须意识到的是,整个/ src / main / etc。结构是用来构建源代码,换句话说,就是.java文件(和资源文件)。在您编译的程序中,此结构将不再以相同的方式存在,因此依赖于src
目录是一个非常非常糟糕的主意。
这个结构适用于maven:
src/main
- >应该成为"计划的一部分"一直以来
src/test
- >所有应该只是"程序的一部分"何时运行自动化测试
src/main/java
- >总是需要存在的.java文件
src/main/resources
- >总是需要在那里的资源(图像,模板等)
src/test/java
- >仅在自动化测试期间需要的.java文件(例如,自动化测试本身)
src/test/resources
- >仅在自动化测试中使用的资源,例如,用于比较结果的文件等
这在哪里引领我们?这导致了一个简单的事实,最终,整个src / main和src / test将根本不存在,实际上,java和资源将被加在一起(你可以通过查看.jar文件来检查它 - 它可以使用任何Zip程序打开)。这就是为什么@LazerBanana是完全正确的:你没有尝试导航目录,你要求资源和资源都在你的类路径中 - 如果它们在资源或java文件夹中(因为那&#39)并不重要; s只是为了保持源代码的结构化。在您的类路径中,两个文件夹组合在一起。