【问题标题】:Java, how to read and store file inside the JAR PackageJava,如何在 JAR 包中读取和存储文件
【发布时间】:2012-01-02 09:33:21
【问题描述】:

我正在尝试使用 Java 构建一个简单的 HTTP 服务器,使用

java.net.ServerSocket = new ServerSocket(this.port, 0, this.ip);
java.net.Socket connection = null;
connection = server.accept();
java.io.OutputStream out = new BufferedOutputStream(connection.getOutputStream());

当使用网络浏览器连接时,我只是从字符串中写入输出(HTTP 标头 + html 代码)

String headers = "http headers";
String response = "this is the response";
out.write(headers.getBytes());
out.write(response.getBytes());
out.flush();
connection.close();

浏览器会正确显示。

现在我的问题是,我想构建一个完整的网页(html、javascript、css、图像)并将这些文件放入 Java 包 (JAR) 文件中,当然,这些文件的设计目的是不-在 JAR 准备好使用后进行修改。以下是问题:

  1. 如何做到这一点?将文件存储在 JAR 中,然后在建立连接时将其输出。

  2. 如何像输出String by out.write() 一样输出图像文件(非文本)?

谢谢,感谢任何示例或代码。

【问题讨论】:

    标签: java sockets java-io httpserver simplehttpserver


    【解决方案1】:

    实现 HTTP 服务器是您的主要问题还是只是实现其他目标的一种方式?如果是后者,请考虑嵌入 Tomcat 或 Jetty,这会更简单并使用标准 servlet API。

    回到您的问题:JAR 只是一个 ZIP 文件,您可以在其中放置任何内容,包括文件、图像、电影等。如果您将文件放在 JAR 文件中,您可以轻松加载它:

    InputStream is = getClass().getResourceAsStream("/dir/file.png");
    

    有关getResourceAsStream() 工作原理的详细信息,请参阅这些问题:

    关于你的第二个问题:当你有一个InputStream 实例时,你可以逐字节读取它并复制到目标outOutputStream。当然还有更好、更安全、更快的方法,但这超出了这个问题的范围。看看IOUtils.copy()

    IOUtils.copy(is, out);
    

    关于您的代码的最后一个提示:如果您发送 Strings ,请考虑使用 API 更简单的 OutputStreamWriterPrintWriter

    【讨论】:

    • 如何将路径确定为“/dir/file.png”,我目前正在尝试您的代码,但is 似乎为空,但我确定文件名是正确的,请问有什么线索吗?
    • 我怀疑你会遇到这个问题,所以我在我的答案中添加了几个链接,以便为你提供一些额外的信息。简而言之:/dir 是 JAR 中的一个目录。如果你用jar xf file.jar 解压它,那么顶层会有一个/dir 目录。用你当前的课程试试:如果你有 com.example.Foo,那么加载 /com/example/Foo.class 应该可以工作。
    • 感谢 Tomasz,我需要学习很多东西。我仍然无法正常工作,is 仍然为空。
    • @Lee:您将文件放在哪里以及如何打开它?您可以考虑提出另一个问题。
    • 我会的。但不是现在,这里是午夜(机智)。不管怎么说,还是要谢谢你。该文件位于项目(Eclipse)中,在src 中,我创建了一个文件夹pages,以及文件index.html。尽管如此,在src 内部,有一个文件夹/包myAppmy.java 正在尝试打开InputStream is = getClass().getResourceAsStream("/pages/index.html");
    【解决方案2】:

    要处理 JAR 文件,请使用 JarOutputStream 或 ZipOutputStream。要输出二进制数据,不要用 Writer 包装输出流。 OuputStream 知道使用方法write(byte)write(byte[]) 写入字节。

    这里唯一的问题是“你为什么要自己开发 HTTP 服务器?”

    【讨论】:

    • JAR 文件是正在运行的应用程序本身。不从“其他”JAR 文件中读取。因此,类似于从应用程序本身获取资源。
    • 我不是在尝试构建独立的httpserver,而是在构建一个应用程序,但我只是简单地尝试使用HTML(网页)构建它的界面,然后引擎是JAVA,因为我'在 Swing 或其他 Java GUI 编程方面不是很好。因此应用程序将被编译成一个 JAR 文件,其中包含应用程序逻辑和网页,其中内置了 httpserver。
    【解决方案3】:

    只要不是家务,我就不会尝试重新发明轮子并开发另一个 Web 服务器。有一个小型嵌入式 Java Web 服务器可用于此目的。

    例如,我曾多次使用Tiny Java Web Server and Servlet Container

    如果您已将它集成到您​​的应用程序中,您可以实现一个新的 javax.servlet.http.HttpServlet,它从 JAR 文件的资源中读取文件。内容可以加载,正如 Tomasz Nurkiewicz 已经指出的 getClass().getRourceAsStream(...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多