#java #tomcat #servlets #jar #fileoutputstream
#java #tomcat #сервлеты #jar #fileoutputstream
Вопрос:
Добрый день,
Я пытаюсь извлечь содержимое файла jar программно и нашел здесь фрагмент кода, который позволил мне извлечь содержимое файла jar на моем локальном компьютере без использования сервлета.
Теперь, когда я знаю, что код работает, я пытаюсь использовать его в локальной среде сервлета, в частности Tomcat 7.0.22. До сих пор у меня есть приведенный ниже код, но я не смог вывести содержимое jar. Я считаю, что я неправильно обрабатываю выходной поток, и именно поэтому ничего не сохраняется в локальном каталоге моего локального сервера Tomcat.
Может ли кто-нибудь указать мне правильное направление или дать несколько советов о том, как исправить код, чтобы он выводил содержимое, прочитанное в файл?
import java.io.*;
import java.util.*;
import javax.servlet.*;
@SuppressWarnings("serial")
public class JarExtractor extends HttpServlet {
@SuppressWarnings("rawtypes")
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String path = getServletContext().getRealPath("test.jar");
JarFile jar = new JarFile(path);
Enumeration jarEnum = jar.entries();
while (jarEnum.hasMoreElements()) {
JarEntry file = (JarEntry) jarEnum.nextElement();
File f = new File(file.getName());
if (file.isDirectory()) { // if its a directory, create it
f.mkdir();
continue;
}
InputStream in = jar.getInputStream(file); // get the input stream
OutputStream output = new FileOutputStream(f);
while (in.available() > 0) { // write contents of 'is' to 'fos'
output.write(in.read());
}
output.close();
in.close();
}
}
catch(Exception ex)
{
//------
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try
{
doPost(request,response);
}
catch (ServletException e)
{
//
}
catch (IOException e)
{
//
}
}
}
Большое вам спасибо за любую помощь, которую кто-либо может предоставить.
Приятных выходных!
Комментарии:
1. Что на самом деле происходит? Есть ли у вас доступ на запись туда, куда вы пытаетесь записать? Вы вообще знаете, куда пишете?
2. Ничего не происходит, когда я запускал код с помощью println, он печатал до тех пор, пока я не инициализировал выходной поток, а затем ничего больше. Я считаю, что у меня есть права на запись, потому что я запускаю Tomcat локально и у меня есть сервлет, который загружает и сохраняет файлы, которые работают нормально. Я пишу в ~/(tomcat-dir)/wtpwebapps/APP-NAME прямо сейчас. ‘Тест. файл jar находится в ~/wtpwebapps/APP-NAME
3. Ваш код не имеет смысла. Мне кажется, что вы пытаетесь записать все записи, найденные в файле JAR, обратно в исходное местоположение. Чего именно вы хотите достичь — прочитать существующий JAR и …?
4. Я хотел бы прочитать содержимое существующего JAR (test.jar ) и запишите содержимое этого jar на диск, в основном извлекая этот jar, но сохраняя файловую структуру нетронутой. Я думаю, что, возможно, я так много возился с этим, что это больше не имеет особого смысла. Все, что я пытаюсь сделать, это взять уже работающий devx.com/tips/Tip/22124 кодируйте и используйте его как сервлет.
5. Вы также пытались указать реальный путь к выходному файлу?
Ответ №1:
Выходной файл также должен основываться на реальном пути (или другом известном местоположении), в противном случае вы, вероятно, записываете вне контекста сервлета в местоположение, основанное только на имени компонента jar.