【发布时间】:2013-07-26 08:59:39
【问题描述】:
我正在开发一个 Java Servlet,它创建一个临时文件以在会话中使用。在会话结束时(即用户“注销”),我需要删除临时文件,然后将用户重定向到初始(“登录”)页面。重定向工作正常,但临时文件保持不变。
我认为它与文件的路径有关,但我不太确定是什么。我在会话启动时创建文件:
String path = request.getSession().getServletContext().getRealPath("/");
File file = File.createTempFile("getter", ".html", new File(path + "/tmp/"));
然后,在关闭会话时,我会这样做:
file.delete();
我知道file.deleteOnExit(),但是……我什么时候退出一个servlet?也许我很困惑,但我肯定会感谢任何帮助! :)
提前谢谢你!
编辑
所以,这里有一些细节:
正如我所说,我正在使用 servlet,暂时不处理会话。我同意@Joop 的观点,即我需要实现会话,但目前只是想做一些简单的测试。
所以,我的 servlet 讨价还价 GET 和 POST 请求。我在POST 请求中使用一个标志来调用一个内部函数,该函数将文件(在类中声明为private File file;)实例化为一个新的临时文件。在连续调用时,文件会被填充并保存。在用户看到的页面中,我有一个指向 servlet(即“this”)的锚点,它传递了一个标志作为参数,一个指示“注销”的标志。然后我调用另一个内部函数来删除先前实例化的文件。
如果是会话问题,我将实施经理并发布我的发现。
编辑 2
我实现了HttpSessionListener,一切似乎都运行良好。现在,在创建会话时,我在之前声明的目录中实例化了一个文件(请注意,它不是临时文件,我使用File file = new File(path + "/tmp/" + req.getSession().getId() + ".html");,因此文件名等于会话 ID)。然后我向会话添加一个属性,其值为文件的完整路径。我继续像往常一样填充我的文件,当用户选择注销时,我使会话无效。然后,在侦听器内部,我检索文件的路径,因此我可以获得指向它的指针:
String fname = ev.getSession().getAttribute("filename").toString();
File f = new File(fname);
f.delete();
所以,现在我收到的消息是肯定的,我的意思是 f.delete() 返回 true,然后我执行 f.exists() 并得到 false。所以应该没问题。但是,这些文件是物理存在的,即它们仍然存在于磁盘上。
我可以试试@A4L 提供的示例。我是不是做错了什么……?
【问题讨论】:
-
你在哪里看到文件还在?您是使用文件 esxplorer 还是在 IDE 中的项目中看到它(例如,在 Eclipse 中,您必须刷新项目,然后该文件将从视图中消失)。您确定该文件不是之前运行的僵尸文件,而之前的删除可能还没有奏效吗?
-
是的,我忘了提这个。正如我在另一条评论中所说,我在各个地方都有文件输出的全名。所以,在创建文件时,我得到:
Created file: F:\workspace\eclipse\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\JavaTestServlet\tmp\241B5CA17233009D92AAA46E1E378BAE.html然后,删除文件后,我检查是否file.exists();,我得到:F:\workspace\eclipse\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\JavaTestServlet\tmp\241B5CA17233009D92AAA46E1E378BAE.html exists: false但是可以从文件资源管理器中看到该文件... -
我尝试在删除之前添加检查文件是否存在。所以,我知道该文件存在,然后它被成功删除,然后它不再存在。这没关系。只是该文件仍然驻留在文件系统上...
-
这很奇怪:S ...据我所知,您在 Eclipse 中将您的项目设置为
Dynamic web project。在这种情况下,eclipse 管理您的 web-content 目录,该目录位于您工作区的.metadata目录中的某个位置。也许日食在那里做了一些奇怪的事情。您应该尝试手动将您的项目部署到独立的 tomcat(没有 eclipse)中,并查看删除后文件是否仍然存在。 -
正如我在@BalusC 的帖子中评论的那样,我也许可以消除临时文件。在最后一次尝试中,我什至无法创建临时文件,所以我认为没有它们会更好。非常感谢您的建议,非常宝贵:)