我继承的项目有一个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的新手。
答案 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
}
}
另见: