如何将System.getProperty("user.dir")更改为项目工作区

11

我尝试在代码中逐行读取一个 .txt 文件,该文件位于 /src/ 目录下方,当我使用测试用例或静态 void main 运行它时,路径输出是正确的。但是,当我使用 Tomcat 服务器运行应用程序时,应用程序根路径指向我下载 Eclipse 的位置 - D:\eclipse\...,而正确的路径应该是 D:\workspace\myproject\src\。这样,它就永远无法找到该文件。

以下是我的代码:

String workDir = System.getProperty("user.dir");
String file = "numFile.txt";
File myFile = new File(workDir + file);
String userPath = myFile.getPath();

所以,我的问题是:

  1. (这可能很傻)我们通常应该将文本文件放在哪里?
  2. 如何更改 [System.getProperty("user.dir");],使其指向我的项目工作区?

谢谢!

Sharon


关于你的回复:

添加以下参数-Duser.home='Your Path',确保在系统变量的开头添加-D。当使用tomcat服务器时,在参数选项卡下提供的Launch Configuration中,您可以将此变量放入VM Arguments框中。

我找不到你所说的地方。它是在Eclipse还是Tomcat目录中?

谢谢


感谢您的回复。 1. 我尝试了这个getClass().getClassLoader().getResourceAsStream("filename.txt"); => 这返回null。猜想它只是无法找到文件。 2. 如@Eng.Fouad的回答:这只是我的错别字修正,是的,我需要额外的“ /”File myFile = new File(workDir +“ / ”+ file); 然而,它仍然不起作用,因为我仍然有一个问题,“workDir”的Tomcat运行时会指向D:\ eclipse。为什么Tomcat服务器认为我的工作区在D:\ eclipse下? 必须在某处进行设置。 帮帮我!我就是找不到答案。谷歌了好几天。谢谢! - user795472
5个回答

10

尝试使用File myFile = new File(workDir, file);代码。


6
简短的答案是,在Java中无法更改正在运行的应用程序的当前工作目录。请参见在Java中更改当前工作目录? 设置user.dir属性不起作用,因为这不会影响操作系统在解析应用程序的路径名时使用的实际当前目录。
在命令行上设置-Duser.dir也不起作用。相反,您需要:
  • 如果您使用脚本启动,请在运行应用程序之前cd到相关目录,
  • 如果您使用ProcessBuilder启动,请使用directory(File)方法设置工作目录,或者
  • 如果您正在使用Eclipse启动器,请在启动配置中设置“工作目录”。

最后,我认为您尝试做的事情是一个坏主意:
  • 有些人编写Tomcat和Web应用程序配置文件,假设Tomcat的当前目录是默认位置;例如$CATALINA_HOME/bin。(这是错误的...但您的黑客将破坏它。)
  • 当您的应用程序进入生产阶段时,您将不想回到某个开发沙箱。
更好的方法是按照@Eng.Fouad的答案进行操作。

4
好的!我明白了!
是的,
File myFile = new File(workDir + "/" + file);

这是正确的方法。我在Eclipse IDE中编辑了Tomcat参数(运行 -> 运行配置... -> Apache Tomcat -> [单击] Tomcat vX服务器 -> 在右侧屏幕上,单击“参数” -> 工作目录部分 -> 我更改为其他并指定我的实际工作目录。)

奇怪的是,即使我不通过Eclipse IDE运行Tomcat,而是通过Dos cmd甚至部署到服务器,它仍将工作目录应用为D:\ Eclipse。但是更改工作目录仍然有效。


8
欢迎来到 Stack Overflow!由于 Eng.Fouad 给出了这个答案,请礼貌地将其接受为正确答案。如果您发现其他答案有用,也请礼貌地给予赞同。谢谢! - sarnold

1

要从类路径的根目录读取文件,请使用以下方法(Eclipse会自动将src目录中的非Java文件复制到classes目录):

this.getClass().getClassLoader().getResourceAsStream("filename.txt");

所以您完全不需要操作当前文件夹。


0

尽量不要更改系统属性,而是将一个参数添加到系统属性中。

例如,添加以下参数-Duser.home='Your Path',确保在系统变量的开头添加-D。您可以将此变量放在参数选项卡下提供的VM Arguments框中,当使用Tomcat服务器时打开启动配置。

如果您从某个主方法运行相同的内容,则将变量添加到运行配置中,因为这将在您的代码中保持完整性。


1
  1. 'user.home' 是错误的属性。
  2. 无论如何都不会起作用;请看我的答案。
- Stephen C
@stephen:为什么属性不对?我可以创建自己的系统变量,当我不需要使用现有的系统属性时,我可以创建自己的。 - M.J.
啊,我明白你的意思了。(如果你的回答有适当的标点符号,那么它会更容易阅读!!!)无论如何,你选择了一个已经被JVM用于表示不同含义的属性;请参考System.getProperties()的javadoc。此外,你仍然需要编写Web应用程序以尊重属性的值,因为仅设置属性是没有效果的。 - Stephen C

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