【问题标题】:java get file pathsjava获取文件路径
【发布时间】:2010-04-23 22:10:00
【问题描述】:

我有一个 jsp 页面,其中包含打印给定目录中所有文件及其文件路径的代码。代码是

if (dir.isDirectory())
        {
            文件[] dirs = dir.listFiles();
            对于(文件 f:目录)
            {
                if (f.isDirectory() && !f.​​isHidden())
                {
                    文件文件[] = f.listFiles();
                    对于(文件 d:文件)
                    {
                        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 即的路径

/images/scores/blah.jpg

我知道我可以乱用一个实际的字符串,即拆分它或字符串匹配,但是有没有更简单的方法呢?

谢谢

【问题讨论】:

    标签: java file jsp path


    【解决方案1】:

    像 webapp 那样依赖文件系统(即使用绝对路径)并不是好的做法,这会降低您的代码的可移植性。

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

    【讨论】:

    • 我不认为可移植性本身就是一个问题,因为所需的文件已经在网络内容中,他只想显示它们。
    【解决方案2】:

    您需要对根路径进行子串化。

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

    顺便说一句,那些System.out.println() 行实际上不会打印到响应中。它们打印到标准输出,标准输出可能是 IDE 控制台或服务器的日志文件。此外,这种逻辑不属于 JSP 文件。在真正的 Java 类中执行,然后转发到 JSP 进行显示。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-06-18
        • 2012-03-11
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多