如何从外部网页内容目录读取文件

发布于 2024-12-11 17:26:25 字数 314 浏览 0 评论 0原文

我在 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 (未找到网络路径)

I have the following scriptlet inside a JSP page.

  File f = new File("//WEB-INF//music//rock//Evanascence//Fallen//text.txt");
  FileReader fr = new FileReader(f);
  out.println(f.exists());

I'm getting a

FileNotFoundException: \\WEB-INF\music\rock\Evanascence\Fallen\text.txt (The network path was not found)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你的背包 2024-12-18 17:26:25

您不应使用 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");
// ...

另请参阅:


与具体问题无关,不用说代码上面属于 servlet,而不是您标记的 JSP 中。在 JSP 内部,您可能会找到 JSTL标记更有用。

<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>

You shouldn't use the File API to reference relative webcontent files. The File API operates relative to the current working directory on the local disk file system, which is dependent on how you started the webserver and is in no way controllable from inside the webapplication's code.

In this particular case you should rather use ServletContext#getResource() or getResourceAsStream():

URL resource = getServletContext().getResource("/WEB-INF/music/rock/Evanascence/Fallen/text.txt");
// ...

or

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/music/rock/Evanascence/Fallen/text.txt");
// ...

(note that those double forward slashes are totally unnecessary, I already removed them)

If it returns null then it don't exist. To wrap it in a Reader, use InputStreamReader wherein you specify the proper character encoding which should be the same as the file is originally saved in:

Reader reader = new InputStreamReader(input, "UTF-8");
// ...

See also:


Unrelated to the concrete question, needless to say that the code above belongs in a servlet, not in a JSP as you tagged. Inside a JSP, you may find the JSTL's <c:import> tag more useful.

<c:import url="/WEB-INF/music/rock/Evanascence/Fallen/text.txt" />

Or if it is possibly non-existing:

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文