1

我正在运行 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使用它的文件)。我也在"Add folder"- Properties window> Sources->中做了Package Folder。(添加了 2 个文件夹,只是为了确保)。所以我亲爱的文件同时在 3 个地方:

  • src/java/com/optimizations/cutting 旁边Servlet.javaDataManager.java

  • src/java/res

  • src/resources 但我还是会得到

    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)
    ....
4

1 回答 1

1

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

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

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()就可以用 arbitraty 代替。Foo.classClassLoader

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

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/example/foo.ext");
于 2012-08-24T18:01:33.183 回答