我有一个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 ie
/images/scores/blah.jpg
我知道我可以乱用一个实际的字符串,即分割它或字符串匹配,但有更简单的方法吗?
由于
答案 0 :(得分:3)
依赖像webapp这样的文件系统(即使用绝对路径)不好的做法会使你的代码不那么便携。
您应该将文件保存在resources
目录中,并使用ClassLoader
加载相对于类路径的文件。请参阅ClassLoader.getResource()
和ClassLoader.getResourceAsStream()
。另一种选择是使用ServletContext.getResource()或ServletContext.getResourceAsStream()。您可以使用继承的getServletContext()
方法获取servlet中的ServletContext
。
答案 1 :(得分: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进行显示。
答案 2 :(得分: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;
}