2

シンプルなHTTPサーバーを作ろうとしています。

しかし、私には少し問題があります。

私の/wwwディレクトリが.jarファイルのコンパイルにある場合、すべてが完璧に機能します:コード:

private static final String DEFAULT_FILES_DIR = "/www";
....
private String getURLFromHeader(String header) {
    //gettint url from header
    ....
    return DEFAULT_FILES_DIR + url;
}
....
System.out.println("Resources: " + url + "\n");
System.out.println("Result code: " + code + "\n");

index.html の場合: Resources: /www/index.html Result code: 200-> すべての作品。

しかし、私がそうするとき:

private static final String DEFAULT_FILES_DIR = "D:/.../.../.../www"; // absolute pass;
....
....

サーバーは「誰も、あなたが私から何をしているのかわかりません」と言います!=) そして次のように入力します: Resources: D:/.../.../.../www/index.html Result code: 404-> ファイルが見つかりません。

それは何ですか?

Ps 入れようとしましprivate static final String DEFAULT_FILES_DIR = "D:\\...\\...\\...\\www";たが、うまくいきません!))))

4

1 に答える 1

9

を使用Class.getResourceAsStream()してリソースをロードしています。これはクラスローダーを使用してリソースをロードし、現在のクラスパス内のパスのみをロードできます。任意のローカル ファイルを読み込むことはできません。

あなたがすべきことはClass.getResourceAsStream()、クラスパスのリソースに使用FileInputStreamし、ファイルシステムのリソースに基本を使用することです。

この 2 つを区別する方法が必要になります。これをどのように実装するかは、要件によって異なります。多くのオプションがあります。いくつかは次のとおりです。

  • でロードを試み、getResourceAsStream()失敗した場合はFileInputStream. これは少しずさんですが、うまくいくかもしれません。注意点は、リソース パスがうっかり間違っていたがローカル ファイルと一致する場合、リソースをロードするつもりだったときに誤ってローカル ファイルをロードする危険性があることです。
  • 「D:」で始まる文字列をファイルとして扱います。これも少しずさんで、他の場所や相対ファイル パスにあるファイルの処理が複雑になる可能性がありますが、非常に単純であり、アプリケーションで機能する可能性があります。
  • 適切な形式の を使用しjava.net.URL、スキーム タイプが「ファイル」の場合は、それをローカル ファイルとして扱います。
  • これを、事前にわかっているリソースのタイプに基づいて作成するリソース ローダー インターフェイスの背後で抽象化します。例(適切と思われる例外を処理します):

    interface ResourceLoader { 
        public InputStream getInputStream (); 
    }
    
    class ClassResourceLoader implements ResourceLoader {
        private final String resource;
        public ClassResourceLoader (String resource) { 
            this.resource = resource; 
        }
        @Override public InputStream getInputStream () { 
            return HttpServer.class.getResourceAsStream(resource);
        } 
    }
    
    class FileResourceLoader implements ResourceLoader {
        private final String resource;
        public FileResourceLoader (String resource) { 
            this.resource = resource; 
        }
        @Override public InputStream getInputStream () { 
            try {
                return new FileInputStream(resource);
            } catch (Exception x) {
                return null; 
            }
        } 
    }
    
    private ResourceLoader getResourceLoaderFromHeader (String header) {
        return ...; // whatever is appropriate.
    }
    

多くの選択肢がありますが、重要な点は次のとおりです。ローカル ファイル リソースを でロードすることはできずClass.getResourceAsStream()、適切と思われる方法で 2 つのケースを異なる方法で処理する必要があります。

于 2013-11-05T20:32:42.463 に答える