2012-01-05 58 views
1

我試圖用spring/tomcat做一些xml編組...我的app被部署爲正常的war文件。該文件確實被複制到正確的位置WEB-INF/classes/myData.xml,但我不確定如何從Java訪問此文件,特別是我的彈簧服務層。正如我通常從應用程序上下文本身訪問文件一樣。在Spring和tomcat中從java訪問文件系統

我想這樣做:

final File xml = new File("WEB-INF/classes/myData.xml"); 

但在我的開發建設也進入F:\日食\ WEB-INF \類\ myData.xml而不是部署目錄的tomcat裏面

回答

6

在春天,一個乾淨的方式與Java做到這一點是使用ClasspathResource

Resource myData = new ClasspathResource("myData.xml"): 

或者,如果這是一個Spring bean做的工作,那麼你可以從XML注入它,例如,

<property name="myResource" value="classpath:myData.xml"/> 

...假設myResourceResource類型的你的Spring bean JavaBean屬性。

WEB-INF/classes目錄是自動在服務器的類路徑上,您不需要(不應該)明確指定該路徑。

春季Resource接口提供了多種方法來獲取數據本身的保持(如getInputStream()

1

如果你下定決心要取得領先到資源的路徑,你可以檢索它的URL,然後分析它,像這樣的:

URL url = getClass().getResource("/WEB-INF/web.xml"); 
    String path = url.toString(); 
    if (path.startsWith("file:/")) { 
     path = path.substring("file:/".length()); 
     File file = new File(path); 
     ...do something with the file... 
    } 

有,然而,一個警告:你的資源可以直接從JAR檔案讀取,而不是從文件系統中的平面文件,因而無法通過File對象很容易得到。上面的內容在JBoss(包括Tomcat)中有效,但是在部署之前JBoss爆炸了一個WAR文件 - 不確定一個純粹的Tomcat是否也會這樣做。

主要問題是:爲什麼你真的想要以File對象的形式獲取資源?也許得到它的URL對你來說已經足夠了?或者,也許你只需要讀取權限?

如果你需要的是讀訪問,最簡單的辦法讓你的類路徑中的任何資源(如上面的web.xml)是通過簡單地調用:

InputStream in = getClass().getResourceAsStream("/WEB-INF/web.xml") 

如果你想要寫訪問該文件,更好的解決方案是預先配置一個目錄(例如,通過web.xml),在那裏解壓所有需要的文件(例如,通過上面的getResourceAsStream方法),然後編輯並從您的預定義目錄中訪問它們這與您的應用程序服務器無關。