我在JSP页面中有以下scriptlet。
File f = new File("//WEB-INF//music//rock//Evanascence//Fallen//text.txt");
FileReader fr = new FileReader(f);
out.println(f.exists());
我得到了
FileNotFoundException: \\WEB-INF\music\rock\Evanascence\Fallen\text.txt (The network path was not found)
答案 0 :(得分:3)
您不应使用File
API来引用相关的webcontent文件。 File
API相对于本地磁盘文件系统上的当前工作目录运行,这取决于您启动Web服务器的方式,并且无法从Web应用程序代码内部进行控制。
在这种特殊情况下,您应该使用ServletContext#getResource()
或getResourceAsStream()
:
URL resource = getServletContext().getResource("/WEB-INF/music/rock/Evanascence/Fallen/text.txt");
// ...
或
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/music/rock/Evanascence/Fallen/text.txt");
// ...
(请注意,那些双正斜杠是完全没必要的,我已经删除了它们)
如果它返回null
则它不存在。要将其包装在Reader
中,请使用InputStreamReader
,其中指定正确的字符编码,该编码应与最初保存的文件相同:
Reader reader = new InputStreamReader(input, "UTF-8");
// ...
无关,不用说belongs中servlet上方的代码,而不是您标记的JSP中的代码。在JSP中,您可能会发现JSTL的<c:import>
标记更有用。
<c:import url="/WEB-INF/music/rock/Evanascence/Fallen/text.txt" />
或者如果它可能不存在:
<c:catch var="e">
<c:import url="/WEB-INF/music/rock/Evanascence/Fallen/text.txt" var="text" />
</c:catch>
<c:choose>
<c:when test="${empty e}">
<pre><c:out value="${text}" /></pre>
</c:when>
<c:otherwise>
<p>An exception occurred when reading file: <pre>${e}</pre></p>
</c:otherwise>
</c:choose>