0

我正在使用REST 和 Java (JAX-RS) 使用 Jersey来创建 Web 服务。现在,对于我的项目,我需要在运行时相对于我的项目创建文件夹。

这就是我所做的。

String str = "<?xml version=1.0><users><user name=\"Taruni\" id=\"501\"></users>";          
File f= new File("helloWorldIndia.xml");
boolean status = f.createNewFile();
FileWriter writer = new FileWriter(f);
writer.write(str);

在这里,状态正在返回true,但文件在我的机器中的任何地方都不可见。我已经扫描了我的机器。即使那样我也找不到。

创建文件夹/文件的正确方法是什么?可以创建相对于项目的文件夹吗?如果不是,还有什么选择?

4

1 回答 1

0

当你这样做

新文件(“helloWorldIndia.xml”).createNewFile()

无论您从哪里运行程序,都会创建文件“helloWorldIndia.xml”。在这种情况下,您的程序正在由 Web 服务器运行。因此,该文件将在您的 Web 服务器部署Web 应用程序的路径上创建,而不是在您放置 war 文件的位置。

现在让我们假设您的网络服务器是码头。使用默认配置,jetty 将战争部署在系统的临时文件夹中,该文件夹在 Windows 上位于 %TEMP%,在 Linux 上位于 /tmp。在这种情况下,如果您在临时文件夹中搜索“helloWorldIndia.xml”,在运行您的代码后,您应该会找到该文件。

话虽如此,某些服务器会在您关闭服务器时删除已部署的文件。在执行 FS 扫描时未找到您的文件的原因可能是在您关闭服务器时已删除部署的文件夹本身。

要找出您的代码在哪里写入文件,请将此行添加到代码段的末尾。

System.out.println(f.getAbsolutePath());

这将记录使用当前代码创建文件的完整路径。

对于 Web 应用程序,您应该将文件写入文件系统的绝对路径。在相对路径上写入是不安全的,因为如果您将服务器配置为部署在不同的位置,那么在不更改配置/代码的情况下可能无法找到以前写入的文件。

最好的方法是在代码中设置要写入文件的文件夹的绝对路径。您可以传递需要写入文件的文件夹的路径 -

  • 作为环境变量(启动服务器时的 -D 属性)。
  • 作为 web.xml 中的servlet 配置属性,如下所示
  • 作为数据库中的配置条目。在运行时执行数据库查询以获取文件夹的路径。
  • 还有很多..

需要注意的是,除非不可避免,否则不建议通过 Web 应用程序编写文件。原因之一可能是交易。事务不能自动处理文件 IO。如果事务失败并需要回滚,您必须手动处理文件写入场景。

于 2013-04-14T16:26:22.347 回答