gpt4 book ai didi

java - 无法使用 Netbeans 7.1.2 访问 servlet 中的文件资源

转载 作者:太空宇宙 更新时间:2023-11-04 08:05:42 24 4
gpt4 key购买 nike

我正在运行 Netbeans 7.1.2,并且我正在尝试访问 servlet 中的一些文本文件:

package com.optimizations.cutting;

@WebServlet(name = "Servlet", urlPatterns = {"/Servlet"})
public class Servlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

System.out.println("in servlet "+System.currentTimeMillis());

response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {

DataManager dm = new DataManager();
SheetInfo si = dm.loadSheetInfoCSV("sheetInfo.csv");
ArrayList<Piece> pieces = dm.loadPiecesCSV("res/pieces4.csv");
....

我已将 sheetInfo.csvpieces4.csv 文件放在我能想到的任何地方,并尝试在前面加上反斜杠( /sheetInfo.csv/res/pieces4.csv )来访问它们

当我说“我能想到的任何地方”时,我的意思是:当前目录(源包),旁边是 Servlet.java 以及我创建的所有其他文件(包括使用它的 DataManager.java)。我还在属性窗口->->包文件夹中执行了“添加文件夹”。 (添加 2 个文件夹,只是为了确保)。所以我亲爱的文件同时位于 3 个地方:

  • src/java/com/optimizations/cutting 位于 Servlet.javaDataManager.java

  • src/java/res

  • src/资源但我仍然明白

    SEVERE: java.io.FileNotFoundException: resources/pieces4.csv (No such file or directory)

    at java.io.FileInputStream.open(Native Method)

    at java.io.FileInputStream.<init>(FileInputStream.java:138)

    at java.io.FileInputStream.<init>(FileInputStream.java:97)

    at java.io.FileReader.<init>(FileReader.java:58)

    at com.optimizations.cutting.DataManager.loadPiecesCSV(DataManager.java:98)`

我还重新启动了服务器(Glassfish 3.1.2)

(也许这看起来很愚蠢,但我还需要知道应该在哪里以及如何放置我的文件,以便可以从客户端和服务器访问它们 - 我的 servlet 将创建一些图像(.jpg)并将它们存储(在哪里?)并将文件名发送回 .jsp,然后将它们显示在颜色框中)

提前致谢。

编辑

添加了更多错误行并DataManager.java中的调用:

public SheetInfo loadSheetInfoCSV(String filename){
....
br = new BufferedReader( new FileReader(filename));
String strLine = "";

//read comma separated file first line
if ((strLine = br.readLine()) != null)
....

最佳答案

该异常表明您正在使用 FileInputStream 来获取它的 InputStream。当资源涉及类路径资源时,这不是正确的方法(您尝试将其放入的所有位置都是类路径的一部分)。您应该使用 ClassLoader#getResourceAsStream() 将类路径资源作为类路径资源获取,而不是使用 FileInputStream 将其作为本地磁盘文件系统资源获取。

如果资源文件 foo.ext 与您尝试加载资源的类(即 DataManager 类)放置在同一包中,那么您可以通过其唯一文件名获取它的 InputStream ,如下所示:

InputStream input = getClass().getResourceAsStream("foo.ext");

或者当您位于static 上下文中时:

InputStream input = DataManager.class.getResourceAsStream("foo.ext");

如果资源 foo.ext 放置在与您尝试加载资源的类不同的包中,例如com.example 包,然后您可以通过其类路径相对路径获取它的 InputStream,如下所示,其中前导斜杠 / 将您带到类路径的根目录:

InputStream input = getClass().getResourceAsStream("/com/example/foo.ext");

此外,getClass() 可以由任意 Foo.class 替换,只要该类由有权访问相同包结构的同一个 ClassLoader 加载即可。

另一种方法是使用从当前线程获取的上下文ClassLoader。它可以访问一切。您只能指定类路径相对路径,它始终相对于类路径的根(因此不应使用前导斜杠 /):

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/example/foo.ext");

关于java - 无法使用 Netbeans 7.1.2 访问 servlet 中的文件资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12113179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com