簡體   English   中英

使用Netbeans 7.1.2無法訪問servlet中的文件資源

[英]can't access file resources in a servlet using Netbeans 7.1.2

我正在運行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 "Add folder"中執行了"Add folder" (添加了2個文件夾,只是為了確保)。 因此,我親愛的文件同時位於3個位置:

  • Servlet.javaDataManager.java旁邊的src/java/com/optimizations/cutting

  • src/java/res

  • src/resources但我stll得到

     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包),則可以通過其classpath相對路徑獲取它的InputStream ,如下所示:前導斜杠/將您帶到類路徑的根:

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

同樣在這里, getClass()可以通過arbitraty取代Foo.class ,只要類是由相同的加載ClassLoader ,其能訪問相同的封裝結構。

一種替代方法是使用從當前線程獲得的上下文ClassLoader 它可以訪問所有內容 您只能指定相對於類路徑的路徑,它始終相對於類路徑的根(因此,不應使用前導斜杠/ ):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM