我先发布我的代码:
private String path = ServerConfigProperties.getProperty("pathToDir");
public load(String path) {
File mainDir = new File(path);
for (File subDir : mainDir.listFiles()) {
if (subDir.isDirectory()) {
System.out.println(subDir.toString());
}
}
}
mainDir
仅在我使用 eclipse clean
时才保存正确的子目录列表。例如,我可以在 mainDir
内有一个子目录列表。当我运行代码时,子目录都会在那里。当我使用 Windows 资源管理器添加更多目录并再次运行代码时,会打印出相同的列表,就好像我没有在主目录中添加新目录一样。如果我随后停止代码,在 Eclipse 中运行 clean
,然后重新启动我的代码,它最终会获取新添加的目录。 mainDir
有什么方法可以在运行时维护最新的目录列表吗?
编辑:
这是在 jetty 服务器上运行的。每次添加新目录时都不需要重新启动服务器,这是不希望的。 load(path)
在服务器中的不同时间被调用,那么为什么它看不到 load(path)
调用之间新添加的目录?
最佳答案
WEB-INF/classes 中的内容由许多不同的组件管理,有些在 Eclipse 中,有些在 Jetty 中,有些在构建工具中。 当您使用 Servlet API 时,不建议使用标准 java 文件 I/O 访问磁盘上的这些内容。
该目录中的内容主要通过类加载器访问(使用 getResource() 或 loadClass() 。
不要将动态内容放入该目录中。
可能发生的情况是,您在项目树中创建它,Eclipse 会经历其构建生命周期,内容会被编译或复制到项目的 WEB-INF/classes
输出目录中。然后,Eclipse 要么构建 war 并部署,要么进行就地部署。然后 Jetty 和 servlet 规范启动,它还解压(如果需要)、移动、创建工作目录和临时目录,并开始使用 Servlet 规范的要求来管理应用程序。
如果您想在运行时管理动态内容,您有几个选择。
- 如果您希望 Jetty 能够向 HTTP 客户端提供内容,则不要将此内容放在
WEB-INF
树中的任何位置(根据Servlet 规范)。 - 如果你想要 Jetty,它 DefaultServlet ,或DefaultHandler ,或ResourceHandler要提供内容,您可以将其放在
WEB-INF
树之外的磁盘上的任何位置(您只需配置适当的 servlet 或处理程序即可使用该目录) - 如果您想自己管理目录内容,甚至为 HTTP 客户端提供服务,那么您可以将其放在
WEB-INF
树之外的磁盘上的任何位置,因为有许多进程管理该目录树,并且无法保证树不会受到您无法控制的事物的干扰。
如果使用嵌入式模式jetty,配置#2的一些示例。
- 默认Servlet - OnServletContext.java
- 默认处理程序 - ExampleServer.java
- 资源处理程序 - FileServer.java
- 自定义文件服务器 - FastFileServer.java
关于java - 将文件添加到目录时无法获取新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17433482/