java—无法使用netbeans 7.1.2访问servlet中的文件资源

gblwokeq  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(312)

我已经运行了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.csv 以及 pieces4.csv 我能想到的任何地方的文件,试图用反斜杠访问它们( /sheetInfo.csv 或者 /res/pieces4.csv )
当我说“我能想到的任何地方”时,我的意思是:当前目录(源代码包),旁边是 Servlet.java 以及我创建的所有其他文件(包括 DataManager.java 使用它)。我也做了 "Add folder"Properties window -> Sources -> Package Folder . (添加了2个文件夹,只是为了确保)。所以我亲爱的文件同时放在三个地方: src/java/com/optimizations/cutting 旁边 Servlet.java 以及 DataManager.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)
    ....
2skhul33

2skhul331#

例外情况表明您正在使用 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");

相关问题