Java, как читать и хранить файл в пакете JAR - PullRequest
0 голосов
/ 20 ноября 2011

Я пытаюсь создать простой HTTP-сервер, используя Java, используя

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 ]

0 голосов
/ 20 ноября 2011

Является ли внедрение HTTP-сервера вашей основной проблемой или просто способом достижения какой-то другой цели? Если последнее, рассмотрите возможность встраивания Tomcat или Jetty, намного проще и со стандартным API сервлета.

Возвращаясь к вашему вопросу: JAR - это всего лишь ZIP-файл, вы можете поместить туда все, включая файлы, изображения, фильмы и т. Д. Если вы поместите файл в JAR-файл, вы можете легко загрузить его с помощью:

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

См. Эти вопросы, чтобы узнать, как работает getResourceAsStream():

О вашем втором вопросе: если у вас есть экземпляр InputStream, вы можете просто прочитать его побайтно и скопировать в цель out OutputStream. Конечно, есть лучшие, безопасные и быстрые способы, но это выходит за рамки этого вопроса. Просто взгляните на IOUtils.copy () :

IOUtils.copy(is, out);

И последний совет относительно вашего кода: если вы отправляете String s, рассмотрите OutputStreamWriter и PrintWriter, которые имеют более простой API.

0 голосов
/ 20 ноября 2011

Пока это не домашняя работа, я бы не стал изобретать велосипед и разрабатывать другой веб-сервер.Имеются небольшие встроенные веб-серверы Java, которые можно использовать для этой цели.

Я, например, несколько раз использовал Tiny Java Web Server и контейнер сервлетов .* Если вы интегрировали его в свое приложение, вы можете реализовать новый javax.servlet.http.HttpServlet, который считывает файлы из ресурсов вашего JAR-файла.Контент может быть загружен, как уже указал Томаш Нуркевич getClass().getRourceAsStream(...).

0 голосов
/ 20 ноября 2011

Для работы с файлами JAR используйте JarOutputStream или ZipOutputStream.Для вывода двоичных данных просто не переносите поток вывода с помощью Writer.OuputStream знает, как писать байты, используя методы write(byte) и write(byte[]).

Единственный вопрос здесь: «Почему вы сами разрабатываете HTTP-сервер?»

...