gpt4 book ai didi

java - 我可以使用 getResource 将文件存储在 Java 中的 ArrayList 中吗?

转载 作者:行者123 更新时间:2023-12-01 14:14:33 24 4
gpt4 key购买 nike

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

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

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

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

这适用于除我的模板之外的所有内容。如果我尝试在 HashMap 中插入 getResource 代码,我的 Response 类中会出现错误。

这是我用来构建 HashMap 的代码:

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

我的想法哪里出了问题?我想我遗漏了一 block 拼图。

更新:这是我运行上面最后一个命令时得到的一部分...所以我认为我的文件路径正确?

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

最佳答案

您收到的 FileNotFoundException 错误不是来自此行:

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

看来,在您将这些 File 对象存储在 HashMap 中后,您正在尝试读取该文件(或通过使用 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 对象,然后您可以将其返回给调用者。这将要求您在 HashMap 中存储一个 InputStream 对象而不是文件。您可以有两个 HashMap ,一个用于类路径中的文件,另一个用于磁盘上的文件。
  • 将所有模板(可能在第一次访问时)提取到临时位置(例如 /tmp),然后存储表示新提取的文件的 File 对象。

关于java - 我可以使用 getResource 将文件存储在 Java 中的 ArrayList 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18235265/

24 4 0