java获取文件路径

问题描述:

我有一个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 

我知道路径我可以只用一个实际的字符串陷入混乱,即分裂它或字符串匹配,但有没有更简单的方法来做到这一点?

感谢

你需要串根路径了。

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以进行显示。

依托这样的文件系统的web应用程序(即使用绝对路径)是不是好的做法将会使你的代码的可移植性。

您应该将文件保存在resources目录中,并使用ClassLoader相对于类路径加载文件。见ClassLoader.getResource()ClassLoader.getResourceAsStream()。另一种选择是使用ServletContext.getResource()ServletContext.getResourceAsStream()。您可以使用继承的getServletContext()方法在servlet中获得ServletContext

+0

我不认为可移植性本身就是一个问题,因为所需的文件已经在webcontent中,他只想显示它们。 – BalusC 2010-04-24 00:07:48

由于/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; 
}