2009-11-23 100 views
7

開發Struts 2應用程序我在以下問題中運行。我需要閱讀使用我的應用程序部署在Web服務器中的文本文件。我怎樣才能知道它的相對路徑。換句話說,如果我知道部署目錄內的相對路徑,我如何才能找到絕對路徑。 當我使用this.getContextPath()(或類似的東西)返回絕對路徑到Web服務器中的文件夾時,出現類似的問題。編輯: 謝謝你們的回答。對我來說,這是:如何讀取Struts 2應用程序中的文本文件

String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt") 

請你解釋爲什麼我的工作,因爲我在java中的第一步。

回答

10

如果它被放置在webapp的類路徑,然後只需使用:

InputStream input = servletContext.getResourceAsStream("file.txt"); 

如果它被放置在全局類路徑,然後使用:

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt"); 

如果它被放置在WebContent ,那麼只需使用:

InputStream input = new FileInputStream(servletContext.getRealPath("file.txt")); 

這些示例假定它們放在根中。您當然可以使用相對路徑而不是類路徑根或web內容根,例如path/to/file.txt。您可以通過ServletActionContext#getServletContext()獲得Struts中的ServletContext

編輯:您有以下編輯你的問題:

編輯:謝謝你們的答案。對我來說,這個工作:

String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt") 

能否請您解釋一下爲什麼

這實際上不是「正確」的方式,而這也是可行的。您只需確保您知道知道相對於文件的路徑,而不是GetPointsOfInterestAction類的實際路徑。這個類當然放在一個不同的包中,所以你基本上需要返回一個目錄(就像在普通的磁盤文件系統中一樣:cd ../等等)。再次,這不是最優雅的方式。您需要使用上述前兩種方法之一,資源名稱爲resources/visitor_attractions.txt

3

Here

ServletActionContext.getServletContext()

你似乎知道從那裏做。

+0

Yeap。問題是如果我嘗試在常量中讀取它,它將返回null。這似乎是一個錯誤的設計決定。 – 2009-11-23 15:30:25

3

您可以使用Resource Bundle。我用它們來查找屬性文件。我相信目錄只需要在Classpath上,ResourceBundle就可以找到它。

2

如果文件在類路徑上(這不清楚,但這是一個好主意),我建議使用實用類org.apache.struts2.util.ClassLoaderUtils。來自java的文檔:

該類對於以容錯方式加載資源和類非常有用,該方法適用於不同的應用程序服務器。

特別注意ClassLoaderUtils.getResourceAsStream(String resourceName, Class callingClass)靜態方法,這是一種方便的方法來將資源加載爲流。作爲記錄,用於查找資源的算法getRessource()給出:

此方法將嘗試使用以下方法 加載 資源(按順序):

  • Thread.currentThread().getContextClassLoader()
  • ClassLoaderUtil.class.getClassLoader()
  • callingClass.getClassLoader()
相關問題