Java Servlets - 写入文件

4
我正在使用Netbeans IDE,目前正在使用GlassFish服务器。 我想要做的是写入文件。 我查看了一些页面,现在我拥有的代码(据我所知不起作用)看起来像:
 File outputFile = new File(getServletContext().getRealPath("/")
            + "TheFile.txt");
    FileWriter fout = new FileWriter(outputFile);
    fout.write("The Content");
    fout.close();

这是我的项目结构:

alt text

此外,文件将放在哪里?

编辑: 我忘了提到图片中还有其他文件夹:测试包、库、测试库和配置文件。但是我不认为文件会放在那里。

编辑(最新): 我发现文件存储在/build/web文件夹中,但这在Netbeans中没有显示。即使我重新启动它也是如此。


我想要做的是写入一个文件。你想要写入什么内容?你想要实现什么目标? - Buhake Sindi
我实际想要编写的是一个 .html 文件。我正在尝试让某人更新已经存在的页面,比如 index.html。因此,当有人尝试这样做时,上面的代码应该被执行。 - whirlwin
3个回答

4

根据你编写的代码,文件将被放置在公共网站根目录中。这就是 getRealPath("/") 指向的位置。确切地说,它就是你截图中名为 Web Pages 的文件夹。作为练习,按照以下步骤找到绝对路径,以便可以通过操作系统磁盘资源管理器查找它。

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

我不熟悉Netbeans,但很可能你需要在文件写入后刷新IDE中的文件夹,以便它出现在IDE的列表中。点击文件夹并按F5键。这至少适用于Eclipse。

尽管如此,这种方法并不推荐使用。当servlet容器没有配置为在磁盘上扩展WAR时,这种方法将无法工作。即使它可以,当WAR被重新部署时,您将丢失所有新文件和对现有文件的更改。不应将其用作永久存储。而应将其存储在Web应用程序之外的固定路径或数据库中(由于您似乎想要重新发明CMS,因此首选数据库)。


谢谢!我找到了它的位置,现在按照我的计划运行。另外,感谢您提供有关存储的额外信息。 - whirlwin
@whirlwin,你能告诉我如何让它工作起来吗?因为我遇到了同样的问题,我创建的文件存储在/build/web/而不是/web/下,先谢谢了 :) - MarwaInsat
@MarwaChaabani 我很想帮忙,但是因为这件事情发生的时间太久远了,我已经完全不记得任何相关信息了。我甚至不确定当时是否成功让它正常工作。 - whirlwin

4
请注意,这种方法不能保证在所有网络容器或重启中都能正常运行,并且很可能会被重新部署覆盖。
如果你想允许用户更新内容,你需要将新内容存储在某个地方,并使用servlet、JSP页或facelet从后端存储中检索新内容并将其发送到浏览器。

2
请参见getRealPath的文档。它会返回指定URL所在磁盘上的位置。
我猜测你的文件位于Glassfish中的Web应用程序根目录(WAR文件提取后)。我不太清楚Glassfish中它的具体位置。
此外,请注意,你正在使用字符串连接来创建文件名。因此,如果getRealPath调用不返回以“/”结尾的字符串,则可能会在Web应用程序的父目录中创建文件。最好在创建实际文件的File对象时,为父目录使用File对象。请查看File API。
我建议在Web应用程序之外创建文件。如果重新部署WAR文件,则可能会删除文件,这可能不是你想要的。
作为Servlet,对于输出文件的需求并没有什么区别。只需按照标准文件API进行操作即可。这里有一个教程:点击这里

谢谢。我深入研究了一下,getRealPath("/")返回一个以“/”结尾的字符串。此外,感谢您提供有关存储文件的额外信息。 - whirlwin

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