0

Java 初心者。Java HTTP サーバーを構築しています (特別なライブラリは許可されていません)。提供する必要がある特定のファイルがあり (テンプレートと呼んでいます)、次のコードを使用してそれらを提供していました。

this.getClass().getResourceAsStream("/http/templates/404.html")

そして、それらを私の.jarに含めます。これは機能していました。(入力ストリームとして読んでいたことに気づきました。)

ここで、テンプレート、通常のファイル、リダイレクト用にすべてのファイルを (ファイル タイプとして) 保存したいと思います: url -> file. ファイルを提供する Response クラスがあります。

これは、私のテンプレートを除くすべてで機能します。ハッシュマップに getResource コードを挿入しようとすると、Response クラスでエラーが発生します。

これは、ハッシュマップを作成するために使用しているコードです。

new File(this.getClass().getResource("/http/templates/404.html").getFile())

これは私が得ているエラーです:

Exception in thread "main" java.io.FileNotFoundException: file:/Users/Kelly/Desktop/Java_HTTP_Server/build/jar/server.jar!/http/templates/404.html (No such file or directory)

このコマンドを実行すると、jar 内のテンプレートが表示されます。

jar tf server.jar

私の考えはどこが間違っていますか?パズルのピースが欠けていると思います。

更新:上記の最後のコマンドを実行したときに得られるものの一部を次に示します...ファイルへのパスが正しいと思いますか?

http/server/serverSocket/SystemServerSocket.class
http/server/serverSocket/WebServerSocket.class
http/server/ServerTest.class
http/templates/
http/templates/404.html
http/templates/file_directory.html
http/templates/form.html
4

1 に答える 1

1

FileNotFoundExceptionあなたが得ているエラーは、この行からのものではありません:

new File(this.getClass().getResource("/http/templates/404.html").getFile())

これらのオブジェクトをハッシュマップに保存した後、ファイルを読み取ろうとしているようです (または関連する APIFileを使用して読み取ってファイルを提供しようとしています)。FileInputStreamスタック トレースと、実際にこの例外をスローしているコードがあれば、より便利でした。

ただし、重要なのは、JAR ファイル内に存在するファイルは、ディスク上のファイルと同じではないということです。特に、Fileオブジェクトはディスク上の抽象パス名を表し、オブジェクトを使用するすべての標準ライブラリFileはアクセス可能であると想定しています。これ/a/path/like/thisも有効な抽象パス名ですが、そうではfile:/Users/Kelly/Desktop/Java_HTTP_Server/build/jar/server.jar!/http/templates/404.htmlありません。これはまさに を呼び出したときに得られるものですgetResource("/http/templates/404.html").getFile()。ディスク上にファイルとして存在しないものを表す文字列を返すだけです。

クラスパスからリソースを直接提供するには、次の 2 つの方法があります。

  • リクエストへのレスポンスとしてストリームを直接返します。は、呼び出し元に返すことができるオブジェクトをthis.getClass().getResourceAsStream()返します。これには、ファイルではなくハッシュ マップにオブジェクトInputStreamを格納する必要があります。InputStreamクラスパスからのファイル用とディスク上のファイル用の 2 つのハッシュ マップを使用できます。
  • すべてのテンプレートを (おそらく最初のアクセス時に) 一時的な場所に抽出し、新しく抽出したファイルを表すオブジェクトを/tmp保存します。File
于 2013-08-14T15:34:59.580 に答える