1

Netbeans 7.1.2 を実行しており、サーブレット内のいくつかのテキスト ファイルにアクセスしようとしています。

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"で行いました。(念のため、2つのフォルダーを追加しました)。したがって、私の大切なファイルは一度に 3 つの場所にあります。Properties windowSourcesPackage Folder

  • src/java/com/optimizations/cuttingServlet.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)

(これはばかげているように思えるかもしれませんが、クライアントとサーバーの両方からファイルにアクセスできるように、ファイルをどこにどのように配置する必要があるかを知る必要もあります-私のサーブレットはいくつかの画像(.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が、リソースをロードしようとしているクラス (つまり、クラス) と同じパッケージに配置されている場合は、次のように、その唯一のファイル名でDataManagerget an を使用できます。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.classClassLoader

ClassLoader別の方法は、現在のスレッドから取得したコンテキストを使用することです。すべてにアクセスできます。クラスパス相対パスのみを指定することはできません。これは常にクラスパスのルートに対して相対的です (したがって、先頭のスラッシュ/は使用しないでください)。

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