Невозможно записать содержимое файла Jar в локальный сервлет на Tomcat 7.0.22

#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.