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

我可以使用getResource在Java中的ArrayList中存储文件吗?,java,http,getresource,Java,Http,Getresource,Java新手。我正在构建一个JavaHTTP服务器(不允许使用特殊的库)。我需要提供某些文件(我称之为模板),我使用以下代码提供这些文件: this.getClass().getResourceAsStream("/http/templates/404.html") 把它们放在我的.jar里。这是有效的。(我意识到我正在将它们作为输入流进行读取。) 现在,我想将模板、常规文件和重定向的所有文件(作为文件类型)存储在一个如下所示的hashmap中:url->File。我有一个响应类来提供文件 这

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

this.getClass().getResourceAsStream("/http/templates/404.html")
把它们放在我的.jar里。这是有效的。(我意识到我正在将它们作为输入流进行读取。)

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

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

这是我用来构建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
我的想法哪里出错了?我想我少了一块拼图

更新:这是我运行上面最后一个命令时得到的一部分…所以我想我正确地找到了文件的路径

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
对象之后,您似乎正在尝试读取该文件(或通过使用
FileInputStream
或相关API读取来提供该文件)。如果您提供了堆栈跟踪和实际引发此异常的代码,那么它会更有用

但关键是JAR文件中的文件与磁盘上的文件不同。特别是,
文件
对象表示磁盘上的抽象路径名,所有使用
文件
对象的标准库都假定它是可访问的。所以
/a/path/like/this
是一个有效的抽象路径名,但是
文件:/Users/Kelly/Desktop/Java\u HTTP\u Server/build/jar/Server.jar/http/templates/404.html
不是。这正是调用
getResource(“/http/templates/404.html”).getFile()
时得到的结果。它只返回一个字符串,表示磁盘上不存在的文件

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

  • 直接返回流作为对请求的响应
    this.getClass().getResourceAsStream()
    将返回
    InputStream
    对象,然后您可以将该对象返回给调用者。这将要求您在哈希映射中存储
    InputStream
    对象,而不是文件。您可以有两个哈希映射,一个用于类路径中的文件,另一个用于磁盘上的文件
  • 将所有模板(可能在第一次访问时)提取到临时位置,例如
    /tmp
    ,然后存储表示新提取文件的
    文件
    对象
尝试使用getPath()而不是getFile()。另外,请确保这是一条有效的路径。谢谢,乔希!但是没用。我得到了同样的精确误差。此外,我还更新了我的问题以显示我的server.jar中的内容。异常的消息文本应该给您一个线索:它是对jar文件的一些引用,该文件可以作为
打开,但不是正确的
文件
位置。为什么这里需要
文件
对象?谢谢你的帮助,Gyro。hashmap中的所有其他值(对于每个键/值对)都是文件。因此,似乎需要一些重新编码的模板不是文件,其余的是文件?抱歉的延误。你完全正确。为了绕过它,我简单地抓取了资源(使用inputstream)并用它创建了一个临时文件。谢谢你的帮助!