java - 将文件添加到目录时无法获取新文件

标签 java eclipse file jetty

我先发布我的代码:

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 规范的要求来管理应用程序。

如果您想在运行时管理动态内容,您有几个选择。

  1. 如果您希望 Jetty 能够向 HTTP 客户端提供内容,则不要将此内容放在 WEB-INF 树中的任何位置(根据Servlet 规范)。
  2. 如果你想要 Jetty,它 DefaultServlet ,或DefaultHandler ,或ResourceHandler要提供内容,您可以将其放在 WEB-INF 树之外的磁盘上的任何位置(您只需配置适当的 servlet 或处理程序即可使用该目录)
  3. 如果您想自己管理目录内容,甚至为 HTTP 客户端提供服务,那么您可以将其放在 WEB-INF 树之外的磁盘上的任何位置,因为有许多进程管理该目录树,并且无法保证树不会受到您无法控制的事物的干扰。

如果使用嵌入式模式jetty,配置#2的一些示例。

关于java - 将文件添加到目录时无法获取新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17433482/

相关文章:

android - 如何在 Eclipse 中 merge 代码

c - 从文本文件中读取索引

java - 解析 XML 截断文件路径

java - 无状态 session bean 在缺少 EntityManager 的上下文中调用

java - 将 BlowfishJ Java 实现与 dren blowfish javascript 实现相匹配; 8字节后的加密值不同

java - 如何在eclipse插件中使用ElementTreeSelectionDialog

android - 尝试使用Maven和/或Gradle将库导入android项目

CSV文件读取问题: with large amont of data

java - 将 JTree (CheckboxTree) 添加到 JDialog

java - Jasper 报表、子报表和编码