Servlets 在web应用程序中从jar内的文件读取

Servlets 在web应用程序中从jar内的文件读取,servlets,jar,Servlets,Jar,我有一个独立的应用程序,我将其导出为JAR文件,将其包含在运行在Tomcat上的web应用程序中 单机应用程序通过以下行读取包“config”中的文件: configFileName = Thread.currentThread().getContextClassLoader().getResource("config/indexer.cfg").getPath(); 不幸的是,这会导致web应用程序中出现异常: java.io.FileNotFoundException: file:\C:\

我有一个独立的应用程序,我将其导出为JAR文件,将其包含在运行在Tomcat上的web应用程序中

单机应用程序通过以下行读取包“config”中的文件:

configFileName = Thread.currentThread().getContextClassLoader().getResource("config/indexer.cfg").getPath();
不幸的是,这会导致web应用程序中出现异常:

java.io.FileNotFoundException: file:\C:\apache-tomcat-7.0.23\IRSimWebApp\WEB-INF\lib\IR_Sim.jar!\config\indexer.cfg (The filename, directory name, or volume label syntax is incorrect)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
java.io.FileNotFoundException:文件:\C:\apache-tomcat-7.0.23\IRSimWebApp\WEB-INF\lib\IR\u Sim.jar\config\indexer.cfg(文件名、目录名或卷标语法不正确)
在java.io.FileInputStream.open(本机方法)
位于java.io.FileInputStream。(未知源)
位于java.io.FileInputStream。(未知源)

我注意到文件路径中有一个感叹号。这会导致错误吗?它是如何到达那里的?

似乎将资源作为
输入流来获取会更好:

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/indexer.cfg");
if (in != null) {
    BufferedInputStream buff = new BufferedInputStream(in);
    // process buff to get contents of file
    buff.close();
}

显然,上面没有异常处理,但您应该了解……

我想,您所做的是正确的。exlcramation表示它在JAR中。该行不可能导致给定的异常。您是否错误地在代码的更深处执行了
新文件输入流(configFileName)
?这将匹配异常。是的,这是由代码后面的新FileInputStream引起的