使用“user.dir”系统属性的相对文件路径

4
我正在尝试在服务器上的Web应用程序中读取本地文件。当我在JBoss部署之前进行测试时,文件路径是正确的。然而,当我将其部署到JBoss时,文件路径会更改为JBoss的bin目录。当部署为war时,user.dir系统属性会发生变化。 如何在不使用绝对文件路径的情况下防止这种情况? 我想避免使用绝对文件路径,因为该项目需要在具有不同目录结构的多台计算机上复制。
String curDir = System.getProperty("user.dir");

String fileLocation = curDir.toString() + "/end/of/path/to/flat.json";
JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(fileLocation)));

5
在Servlet环境中,您不应该使用相对于用户目录的路径。 - meskobalazs
2
@meskobalazs 我稍微了解一下classpath资源。这是我应该更深入研究的东西吗? - UltraSonja
1
那将是一个更好的想法。 - meskobalazs
@UltraSonja 如果您有不同结构的机器,则应该有一些配置设置来设置基本目录,并使所有路径相对于此目录。这可以确保您在所有方向上都具有最大的灵活性。 - glglgl
这是一个仅在应用程序运行期间需要的临时文件吗?还是即使应用程序没有运行也需要保留它? - Jose Martinez
显示剩余2条评论
2个回答

0

感谢这个问题和答案,我找到了解决方案。虽然我不确定这是否是最好的方法,但它确实有效。我在我的Web应用程序中添加了src/main/resources文件夹,并将需要访问的文件放在那里。

来自src/main/resources的资源将被放置在类路径的根目录下,因此您需要按以下方式获取资源:

代码:

String file = "/flat.json";

JsonReader reader = new JsonReader(new InputStreamReader(getClass().getResourceAsStream(file)));

1
这适用于在构建WAR时创建的文件。一旦部署,不要再添加到资源中。 - Jose Martinez
@JoseMartinez那么对于在构建时间之后或者没有被创建的文件,我应该使用什么方法呢?在实时环境中,这些文件将会定期生成。 - UltraSonja
如果文件只是暂时需要,那么使用tmp.dir;适用于缓存。如果文件在同一容器实例上的部署之间需要使用(例如安装在目录中的JBOSS),则考虑使用相对路径。相对路径将存在于重复部署之外,而资源文件夹将在每次部署时重新部署。如果文件需要存在于各种容器中,并且应用程序可能安装在不同的目录中,则执行DB应用程序所做的操作,它们具有指定的DATA目录,该目录是绝对的,但可以使用env变量或系统属性进行覆盖。 - Jose Martinez
为此,您需要在目标操作系统上拥有良好的读取文件权限。这将取决于您的生产环境的限制。但通常情况下,服务器会设置一个特定的用户,该用户仅对其安装文件夹具有权限,并且这些Web应用程序不需要更多的安全性。正如我在答案中所说,如果您想访问位于Web应用程序中的文件,请使用ServletContext,它将为您提供Web应用程序的真实路径。 - fabien t

0

你尝试过从哪里调用吗?

HttpServeltRequest.getServletContext().getRealPath("META-INT/aop.xml");

它会在当前操作系统上给出真实路径。

祝好,

FT


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接