Java Servlet:删除临时文件

Ior*_*nov 3 java tomcat servlets

我正在开发一个Java Servlet,它创建一个临时文件以在会话中使用.在会话结束时(即用户"注销"),我需要删除临时文件,然后将用户重定向到初始("登录")页面.重定向工作正常,但临时文件保持不变.

我认为它与文件的路径有关,但我不确定是什么.我在会话启动时创建文件:

String path = request.getSession().getServletContext().getRealPath("/");
File file = File.createTempFile("getter", ".html", new File(path + "/tmp/"));
Run Code Online (Sandbox Code Playgroud)

然后,当关闭会话时,我做:

file.delete();
Run Code Online (Sandbox Code Playgroud)

我知道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();
Run Code Online (Sandbox Code Playgroud)

所以,现在我得到消息是积极的,我的意思是f.delete()返回true,并在此之后我做f.exists(),我得到false.所以应该没问题.但是,文件实际存在,即它们仍然存在于磁盘上.

我可以试试@ A4L提供的这个例子.我做错了什么......?

Bal*_*usC 8

请在运行时停止编写任意文件以部署文件夹.只需写入真正的临时文件夹即可.完全摆脱以下几行:

path = request.getSession().getServletContext().getRealPath("/");
Run Code Online (Sandbox Code Playgroud)

并且只是使用

File file = File.createTempFile("getter", ".html");
Run Code Online (Sandbox Code Playgroud)

您的具体问题很可能是因为部署文件夹中的文件通常由servletcontainer锁定.您无法删除其中的文件.

对未来的暗示:每当你认为getRealPath()可以解决问题时,你应该立即停止编写代码并三思而后行,以确定它是否是解决具体问题的正确工具.在我开发基于Servlet的Web应用程序的十年中,该方法没有一个合理的真实世界用例.另请参见servletcontext.getRealPath("/")的含义以及何时使用它


我知道file.deleteOnExit(),但是...什么时候退出servlet?

你没有.容器呢.这里的"退出"基本上意味着关闭整个JVM.甚至在javadoc(强调我的)中也提到了这一点.

请求在虚拟机终止时删除此抽象路径名表示的文件或目录.