2012-04-26 63 views
0

在Eclipse IDE中,有一個獨立的Java應用程序讀取文件。這些文件全部位於項目下的文件夾中。
我創建了另一個web應用程序並編寫了一個servlet,並將上述應用程序的jar文件添加到WEB_INF/lib中,以便我可以使用它中的所有類。servlet非常簡單,但是java應用程序無法將文件讀爲它用於早期。我得到java.io.FileNotFoundException(系統找不到指定的路徑)。
我檢查了jar文件,它包含了包含要讀取的文件的文件夾。我甚至嘗試將文件夾添加到TOMCAT中的類路徑中。但仍然無法擺脫那個錯誤。有人告訴我什麼是錯的?在servlet中的jar中運行類時出現FileNotFoundException

在那裏我得到了錯誤的地方

public class KnowledgeSummaryServlet extends HttpServlet { 

Answerer a = new Answerer(); 

類回答者是這樣

public class Answerer { 
Lookup lvg = new Lookup("resources/test/xyz", "resources/test/test.txt"); 

這是錯誤跟蹤,一旦我運行Servlet

java.io.FileNotFoundException: resources\test\xyz (The system cannot    
find the path specified) 
at java.io.FileInputStream.open(Native Method) 
at java.io.FileInputStream.<init>(FileInputStream.java:138) 
at java.util.Scanner.<init>(Scanner.java:656) 
at com.Lookup.localInitialize(Lookup.java:49) 
at com.Lookup.<init>(Lookup.java:44) 
at com.Answerer.<init>(Answerer.java:27) 
at com.web.KnowledgeSummaryServlet.<init>(KnowledgeSummaryServlet.java:20) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
at java.lang.Class.newInstance0(Class.java:372) 
at java.lang.Class.newInstance(Class.java:325) 
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:119) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048) 
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:799) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 
+0

這是相當奇怪的是,你會得到一個'FileNotFoundException'在讀取資源類路徑。這表明你試圖通過本地磁盤文件系統的方式來訪問類路徑資源,而不是通過類路徑的方式,這是沒有意義的。你可以編輯你的問題來顯示你的嘗試代碼並粘貼整個堆棧跟蹤? – BalusC 2012-04-27 03:03:28

+0

我剛剛編輯了問題 – icedek 2012-04-27 04:26:44

回答

2

你不應該使用FileInputStream作爲本地磁盤文件系統資源獲取classpath資源。這沒有意義。使用ClassLoader獲取類路徑資源作爲類路徑資源。

既然你是在一個servlet和假設/resources文件夾是CLASSPATH的一部分,只是讓他們如下:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream xyzInput = classLoader.getResourceAsStream("test/xyz"); 
InputStream txtInput = classLoader.getResourceAsStream("test/test.txt"); 
// ... 
+0

謝謝,這工作。但在將來部署時,有沒有辦法讓事情工作,而無需將文件夾添加到類路徑?不能從Java應用程序的jar文件中獲取文件夾? – icedek 2012-04-27 06:07:46

+0

類路徑還涵蓋了所有JAR。 – BalusC 2012-04-27 11:57:54

相關問題