Java中的相对文件引用

时间:2013-05-28 21:25:43

标签: java file-io relative-path

我继承的项目有一个excel模板,当用户执行操作时会填充该模板。编程它的人最初在ApplicationProperties.properties文件中执行此操作。

#LOCAL
TemplatePath=C:/.../web/fileName.xls
#LIVE
#TemplatePath=/usr/share/tomcat/webapps/projectName/fileName.xls

有几个不同的文件设置如此,所以每次我们必须部署时,我必须确保进入应用程序属性文件并更新它们。我想重构代码,以便只使用文件的相对路径。如果这是一个.net项目,我会使用Server.MapPath()来获取当前路径,然后将目录/文件名附加到它上面。

有没有办法在Java中做到这一点?或者,还有更好的方法?当我在Google上搜索问题时,我注意到将文件放在WEBINF /类中。那个更好吗?这是如何运作的?我是Java的新手。

2 个答案:

答案 0 :(得分:3)

如果您将其放在WEB-INF/classes目录中,那么这些文件将在您的类路径中可用,您可以使用MyClass.class.getResourceAsStream("classpath path")来引用它们。这比你想要做的更好,因为类路径在你的控制之下。当您使用文件的相对路径时,如果不同的IDE使用不同的工作目录,则代码可能会中断。

当然,如果你这样做,你就不能轻易写入这些文件,因为它们会出现在你的war文件中。但我不确定这是否是你的要求。

以下是与您的问题相关的好答案:getResourceAsStream() vs FileInputStream

答案 1 :(得分:1)

您可以将XLS模板放在java包中,类似:

MyWebApp
+---src
|   \---org
|       \---paulvargas
|           \---test
|               |   TestServlet.java
|               |
|               \---resources
|                       template.xls
|
\---WebContent
    \---WEB-INF
        |   web.xml
        |
        \---lib

部署应用程序时,文件template.xls将自动放置在java包classes指示的目录中的WEB-INF/classes/org/paulvargas/test/resources/目录中。所以,要阅读文件:

package org.paulvargas.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Scanner;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        ClassLoader classLoader = Thread.currentThread()
            .getContextClassLoader();
        InputStream inputStream = classLoader
            .getResourceAsStream("org/paulvargas/test/resources/template.xls");

        // Populate the template

    }

}

另见: