Java从项目基目录中读取文件夹

时间:2013-11-21 10:34:21

标签: java maven relative-path

我有一个具有典型项目结构的maven项目。在项目的基础上,我有一个目录名称 res ,它有一些资源(> 500 MB)。 我正在尝试使用

this.class().getClassLoader().getResourceAsStream("res/xxx")

此代码片段从该文件夹中读取,但它返回一个空资源流。 我在下面有一些解决方法,但由于下面解释的原因,这些都不可接受。

  1. 我可以将文件夹移动到{base} / target / classes,它会被读取,但是当我执行 mvn clean 时它也会被清除。因此,这种方法不起作用。出于某种原因,将路径指定为 ../../ res / xxx 也不起作用。
  2. 我可以将文件夹移动到{base} / src / resources,但随后它将被复制到目标/类和jar。因此,这也是不可接受的。
  3. 虽然我愿意尝试其他一些java API,但我可能只需使用类加载器机制,因为有一些外部库组件也试图使用类似的方法访问 res 文件夹做法。
  4. 有什么方法可以从项目基目录中读取 res 文件夹吗? pom.xml 文件中是否有一些可以帮助我的设置?

2 个答案:

答案 0 :(得分:4)

使用this.class().getClassLoader().getResourceAsStream("/res/xxx")然后您将从类路径的根读取,而不管Windows或Linux中的实际文件/文件夹位置。这实际上是读取文件最安全的方法之一,尤其是当您不知道应用程序最终将如何部署时。

这意味着您的类路径必须包含res的父级,并且在部署应用程序时必须复制res / /

否则,如果您想使用相对路径,请尝试使用此代码段(取自此SO answer):

String filePath = new File("").getAbsolutePath();
filePath.concat("path to the property file");

答案 1 :(得分:1)

如果您使用this.class().getClassLoader().getResourceAsStream("/res/xxx"),它将尝试从类路径加载资源。如果您不希望这样做,则需要指定绝对路径。


Classpath上的资源

如果您不希望将资源内置到JAR中,我建议在src/main/resources目录下使用其中包含文件的不同maven项目。这将创建一个包含文件的jar文件,大小约为500MB。

在此之后,您可以在包含应用程序代码的项目中包含此项目的依赖项。然后,这将能够使用getResourceAsStream(...)从jar文件中引用它。

如果您不希望随应用程序一起提供此大型jar文件,请确保使用<scope>provided</scope>标记依赖项。


来自绝对路径的文件

您需要将文件位置作为主方法中的参数,然后使用new File("C:\\path\\to\\your\\file.txt"),然后使用FileReader将其读入。