2010-04-23 229 views
3

我有一個jsp頁面,其中包含打印給定目錄及其文件路徑中的所有文件的代碼。代碼是java獲取文件路徑

if (dir.isDirectory()) 
     { 
      File[] dirs = dir.listFiles(); 
      for (File f : dirs) 
      { 
       if (f.isDirectory() && !f.isHidden()) 
       { 
        File files[] = f.listFiles(); 
        for (File d : files) 
        { 
         if (d.isFile() && !d.isHidden()) 
         { 
          System.out.println(d.getName()+ 
          d.getParent() + (d.length()/1024)); 
         } 
        } 
       } 
       if (f.isFile() && !f.isHidden()) 
       { 
        System.out.println(f.getName()+ 
        f.getParent() + (f.length()/1024)); 
       } 
      } 
     } 

問題是它打印完整的文件路徑,從tomcat訪問時是無效的。例如,代碼吐出以下路徑:

 
/usr/local/tomcat/sites/web_tech/images/scores/blah.jpg 

,我希望它只是打印多達/圖像即

 
/images/scores/blah.jpg 

我知道路徑我可以只用一個實際的字符串陷入混亂,即分裂它或字符串匹配,但有沒有更簡單的方法來做到這一點?

感謝

回答

2

你需要串根路徑了。

File root = new File(getServletContext().getRealPath("/")); 
for (File file : root.listFiles()) { 
    // ... 
    String path = file.getAbsolutePath().substring(root.getAbsolutePath().length()); 

順便說一句,這些System.out.println()行實際上不會打印到響應。它們打印到可能是IDE控制檯或服務器日誌文件的stdout。此外,這種邏輯不屬於JSP文件。在真正的Java類中進行並轉發到JSP以進行顯示。

3

依託這樣的文件系統的web應用程序(即使用絕對路徑)是不是好的做法將會使你的代碼的可移植性。

您應該將文件保存在resources目錄中,並使用ClassLoader相對於類路徑加載文件。見ClassLoader.getResource()ClassLoader.getResourceAsStream()。另一種選擇是使用ServletContext.getResource()ServletContext.getResourceAsStream()。您可以使用繼承的getServletContext()方法在servlet中獲得ServletContext

+0

我不認爲可移植性本身就是一個問題,因爲所需的文件已經在webcontent中,他只想顯示它們。 – BalusC 2010-04-24 00:07:48

0

由於/usr/local/tomcat/sites/web_tech/images/scores是列出的目錄,有/usr/local/tomcat/sites/web_tech作爲根輸出似乎有點...任意。

我能想到的最好的事情是有一個File root = <your intended root>;,然後做同樣的事情到

String path = f.getName(); 
while (!f.equals(root)) { 
    f = f.getParent(); 
    path = f + "/" + path; 
}