【问题标题】:How to get to a local file in servlet如何在 servlet 中访问本地文件
【发布时间】:2014-08-11 04:51:39
【问题描述】:

我在本地设置了 Tomcat 服务器,并将我的文本文件放在了我的 C 盘 (c:\test\myfile.txt)。

在我的 servlet 中,我指定了要读取的文件的确切路径。我成功地做到了。

我的问题是,我应该在部署之前将 txt 文件放在哪里,以及如何导航到它来阅读它? 我做了一个测试并在本地 Tomcat 上运行

System.out.println("Working Directory = " +
              System.getProperty("user.dir"));

它向我展示了 Eclipse 文件夹!也许是因为我通过 Eclipse 运行了 Tomcat。所以我确信要么有一个特定的数据文件夹,要么我应该在文件系统的某个地方创建一个,但我需要相对路径。

欢迎提出任何建议

【问题讨论】:

    标签: java tomcat servlets


    【解决方案1】:

    这是你的选择。基本上有三种方式:

    把它放在类路径中,这样你就可以通过ClassLoader#getResourceAsStream()使用类路径相对路径来加载它:

    Properties properties = new Properties();
    properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties"));
    

    这里 filename.properties 应该被放置在 webapp 的默认类路径所覆盖的根目录之一中,例如Webapp/WEB-INF/libWebapp/WEB-INF/classesAppserver/libJRE/lib。如果属性文件是特定于 webapp 的,最好将其放在 WEB-INF/classes 中。如果您在 IDE 中开发项目,也可以将其放在 src 文件夹(项目的源文件夹)中。

    您也可以将其放在默认类路径之外的某个位置,并将其路径添加到应用服务器的类路径中。例如在 Tomcat 中,您可以将其配置为 Tomcat/conf/catalina.properties 的 shared.loader 属性。

    2.) 将它放在 web 文件夹(项目的 web 内容文件夹)中的某个位置,以便您可以通过 ServletContext#getResourceAsStream() 使用 webcontent-relative 路径加载它:

    Properties properties = new Properties();
    properties.load(getServletContext().getResourceAsStream("/WEB-INF/filename.properties"));
    

    请注意,我已经演示了将文件放在/WEB-INF 文件夹中,否则任何网络浏览器都可以公开访问它。另请注意,ServletContext 位于任何 HttpServlet 类中,只能由继承的 GenericServlet#getServletContext() 访问。

    3.) 将它放在本地磁盘文件系统的某个位置,以便您可以使用通常的java.io 方式使用本地磁盘文件系统的绝对路径加载它:

    Properties properties = new Properties();
    properties.load(new FileInputStream("/absolute/path/to/filename.properties");
    

    这里有很多不同的方法,但这取决于您的需要:

    要从$TOMCAT_HOME/conf directory 加载属性文件,您需要使用java.io.File 对象访问它,因为类加载器(如this.getClass().getClassLoader().getResourceAsStream(...) 中仅能够从您的类路径加载文件(和类)(在WEB-INF/classesWEB-INF/lib$TOMCAT_HOME/lib)。

    Tomcat's config directory 加载文件的最简单示例是:

    File configDir = new File(System.getProperty("catalina.base"), "conf");
    File configFile = new File(configDir, "myconfig.properties");
    InputStream stream = new FileInputStream(configFile);
    Properties props = new Properties();
    props.load(stream);
    

    【讨论】:

    • 谢谢。但是你为什么一直使用属性呢?我想要文件路径,因为我需要将它传递给 3rd 方库。我不希望它加载到属性中
    【解决方案2】:

    将您的配置文件放在您的 webapp WEB-INF/classes 文件夹下,并在代码中像这样阅读

    InputStream is= 
       YourClassName.class.getResourceAsStream("myfile.txt");
    

    如果你想在 JSP 中尝试这些其他选项。

    String myfile=
      application.getRealPath("myfile.txt"));
    
    or
    
    String myfile =
      getServletContext().getRealPath("myfile.txt"));
    

    【讨论】:

    • 谢谢。但是我生成了战争文件,所以我怎样才能把它放在类文件夹中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2013-06-03
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多