Java获取文件路径

3
我有一个包含代码的jsp页面,它打印给定目录中所有文件及其文件路径的代码为:
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 的路径,即:
/images/scores/blah.jpg
我知道我可以手动操作字符串,如分割或匹配字符串,但是否有更简单的方法?
谢谢。
3个回答

3
过分依赖文件系统(即使用绝对路径)开发 Web 应用程序不是好的实践方法,会使你的代码难以移植。你应该将文件放在一个名为 resources 的目录中,并使用 ClassLoader 相对于类路径来加载文件。请参阅 ClassLoader.getResource()ClassLoader.getResourceAsStream()。另一种选择是使用 ServletContext.getResource()ServletContext.getResourceAsStream()。你可以通过继承的方法 getServletContext() 在 Servlet 中获取 ServletContext

我认为可移植性本身并不是一个问题,因为所需文件已经在Web内容中了,他只是想显示它们。 - BalusC

2
您需要将根路径截取掉。
File root = new File(getServletContext().getRealPath("/"));
for (File file : root.listFiles()) {
    // ...
    String path = file.getAbsolutePath().substring(root.getAbsolutePath().length());

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


0

由于正在列出的目录为/usr/local/tomcat/sites/web_tech/images/scores,因此将/usr/local/tomcat/sites/web_tech作为输出的根目录似乎有点...任意。

我能想到的最好的方法是有一个File root = <你打算使用的根目录>;,然后做类似于以下内容的操作

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接