gpt4 book ai didi

java - Tomcat 和打开文件处理程序

转载 作者:行者123 更新时间:2023-11-28 23:05:11 26 4
gpt4 key购买 nike

我正在使用 Axis 和 Apache Tomcat 7 编写 Web 服务。该服务使用第三方库对文件进行一些转换,并最终创建一个包含更多文件(子文件夹和常规文件)的文件夹。转换完成后,该服务会创建一个 zip 存档并将其返回。当它收到一个新请求时,首先它会删除在上次请求期间创建的文件,然后开始处理该请求。

服务本身运行良好,至少满足了第一个请求。问题是当收到第二个请求时,服务无法删除上次请求期间生成的所有文件。我使用的是 Windows XP 和 Process Explorer,我看到 Tomcat 使一些文件(但不是全部)保持打开状态,这就是我无法删除它的原因。

即使服务操作结束,我正在使用的库是否可能使文件保持打开状态?在我用来创建 zip 存档的代码中,我似乎关闭了所有打开的流。顺便说一句,即使我原谅关闭它们,在服务操作将他的结果返回给客户后它们还能保持打开状态吗?如果是这样,为什么 Tomcat 进程只打开部分文件?

似乎一段时间后一些文件被“释放”,但其他文件始终保持打开状态...

我希望有人能给我一些关于如何处理这种情况的建议:)

最佳答案

转贴我的评论,好像有用。

如果一个文件处理程序没有被释放,它永远不会被释放,直到 servlet 容器关闭。某些实现还可能将文件处理程序的释放延迟到对象被垃圾收集时。除了确保关闭所有处理程序外,您无能为力。如果它是第三方库,那么您必须报告错误或自行修复。

我防止此类问题的最佳做法是确保文件处理程序以与打开它相同的方法关闭。如果未在该方法中打开,则永远不要关闭它。

public void method() {
//open file handler
//do something
//close file handler. make sure it is closed even if there is an exception.
}

永远不要让文件处理程序成为一个字段。

public class A {
private FileInputStream fin = null; // never do this. you will have hard time keeping track of when to release it.
}

关于java - Tomcat 和打开文件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10786659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com