【问题标题】:How to read a directory in webapp folder of Maven application如何读取 Maven 应用程序的 webapp 文件夹中的目录
【发布时间】:2012-03-09 03:38:55
【问题描述】:

我正在使用 Maven Web 应用程序 (Java)。我需要在我的 webapp 文件夹中读取一个目录(例如:mydirectory),如下所示:

File file = new File("path of my directory");

我只是在我的应用程序中指定文件夹的层次结构。

MyApplication->src->main->webapp->MyDirectory

但是我要写我的Java代码我的包如下,

MyApplication->src->main->java->com->mypackage->myfile.java

我需要从 myfile.java 读取 webapp 中的目录“MyDirectory”。 as new File("目录路径")

但是我不知道这里如何指定目录的路径。

【问题讨论】:

    标签: java jakarta-ee file-io filesystems maven-3


    【解决方案1】:

    试试

    ServletContext context = getServletContext();
    InputStream is = context.getResourceAsStream("/MyDirectory/FileInThatDir.txt");
    

    或者使用getResource() 代替getResourceAsStream()

    【讨论】:

    • 我试过这个 ServletContext context = getServletContext();它显示错误找不到符号 getServletContext()。帮帮我
    • 如果您不在继承 HttpServlet 的类中,您需要有一个请求,您可以从中获取会话。您可以从会话对象调用 getServletContext 方法。例如request.getSession().getServletContext()
    • 我已经发布了一个答案,涵盖了没有直接涉及 servlet 上下文的情况,但这需要 spring
    【解决方案2】:

    您没有提到您使用什么技术/框架,但我想您至少在使用 Java servlet,因为您提到它是一个 Web 应用程序。所以你可以使用ServletContext.getRealPath()来获取文件系统中的路径:

    String fullPath = getServletContext().getRealPath("/MyDirectory");
    System.out.printf("real filesystem path: %s", fullPath);
    

    更新:

    请注意该方法的 JavaDoc 说:

    返回的真实路径将采用适合运行 servlet 容器的计算机和操作系统的格式,包括正确的路径分隔符。

    只有当容器从包含它们的 JAR 文件中解压它们时,才必须考虑捆绑在应用程序的 /WEB-INF/lib 目录中的 JAR 文件的 /META-INF/resources 目录中的资源,在这种情况下,指向必须返回未打包的位置。

    如果 servlet 容器无法将给定的虚拟路径转换为真实路径,则此方法返回 null。

    这表示返回的路径:

    1. 不可移植(例如,在 Windows 中使用 \,在 Linux/macOS 中使用 /,等等)。
    2. 可能是null,例如如果资源实际上在内存中、在 JAR 文件中等等。

    因此:请仅在记住这些警告的情况下遵循我的答案,最好使用ServletContext.getResourceAsStream() 遵循其他答案

    【讨论】:

      【解决方案3】:

      在运行时,不再有 maven(感谢上帝!),也不再有目录。你所拥有的只是一个war文件,所有的东西要么在war文件中,要么在文件系统上的应用程序之外的某个地方。

      使用ServletContext.getResourceAsStream() 从 web 应用的上下文中加载文件。

      【讨论】:

        【解决方案4】:

        我无法访问 servlet 上下文,因为我需要从 webapp 文件夹读取数据的服务不知道当前的 servlet 上下文。

        任何使用 Spring 的人都可以通过简单地实现 spring 框架提供的 ResourceLoaderAware 接口来访问 webapp 文件夹。

        public class SomeService implements ResourceLoaderAware {    
            
            private ResourceLoader resourceLoader;
            
            @Override
            public void setResourceLoader(ResourceLoader resourceLoader) {
                this.resourceLoader = resourceLoader;
            }
            
            public readFromWebappFolder() {
                Resource resource = resourceLoader.getResource("path/to/file/in/webappFolder");
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-03-08
          • 2013-11-12
          • 2014-01-10
          • 2018-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-09
          • 1970-01-01
          相关资源
          最近更新 更多