Java,如何在JAR包中读取和存储文件

时间:2011-11-20 15:10:25

标签: java sockets java-io httpserver simplehttpserver

我正在尝试使用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,images)并将这些文件放入Java包(JAR)文件中,当然,这些文件的设计不是 - 在JAR准备好使用之后进行修改。以下是问题:

  1. 如何实现这一目标?将文件存储在JAR中,然后在建立连接时输出它们。

  2. 如何输出图片文件(非文字),就像String输出out.write()一样?

  3. 谢谢,感谢任何样本或代码。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

回到你的问题:JAR只是一个ZIP文件,你可以放任何东西,包括文件,图像,电影等。如果你把文件放在一个JAR文件中,你可以用以下方法轻松加载:

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

请参阅以下问题,详细了解getResourceAsStream()的工作原理:

关于第二个问题:当您拥有InputStream个实例时,您可以逐个字节地读取它并复制到目标out OutputStream。当然,有更好,更安全,更快捷的方式,但这超出了这个问题的范围。只需查看IOUtils.copy()

IOUtils.copy(is, out);

关于您的代码的最后提示:如果您要发送String,请考虑OutputStreamWriterPrintWriter哪些API更容易。

答案 2 :(得分:0)

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

例如,我有几次使用Tiny Java Web Server and Servlet Container

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