我在JSP页面中有以下脚本。
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)
最佳答案
您不应该使用File
API引用相关的Web内容文件。 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");
// ...
也可以看看:
getResourceAsStream() vs FileInputStream
与具体问题无关,不用说在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>
关于java - 如何从外部Web内容目录读取文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7892277/