0

Java新手。我正在构建一个 Java HTTP 服务器(不允许使用特殊库)。我需要提供某些文件(我称之为模板),我正在使用这段代码为它们提供服务:

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

并将它们包含在我的 .jar 中。这行得通。(我意识到我正在将它们作为输入流读取。)

现在我想将模板、常规文件、重定向的所有文件(作为文件类型)存储在一个哈希图中,如下所示:url -> 文件。我有一个提供文件的响应类。

这适用于除我的模板之外的所有内容。如果我尝试在 hashmap 中插入 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())

似乎在将这些File对象存储在哈希映射中之后,您正在尝试读取文件(或通过使用FileInputStream或相关 API 读取来提供文件)。如果您提供了堆栈跟踪和实际引发此异常的代码,那将会更有用。

但关键是 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()。它只返回一个字符串,该字符串表示磁盘上不存在的文件。

有两种方法可以直接从类路径提供资源:

  • 直接返回流作为对请求的响应。this.getClass().getResourceAsStream()将返回您InputStream可以返回给调用者的对象。这将要求您将InputStream对象存储在哈希图中而不是文件中。您可以有两个哈希映射,一个用于类路径中的文件,一个用于磁盘上的文件。
  • 将所有模板(可能在第一次访问时)提取到一个临时位置/tmp,然后存储File代表新提取文件的对象。
于 2013-08-14T15:34:59.580 回答