Как мне записать файл из сервлет-фильтра и прочитать его в Eclipse? - PullRequest
0 голосов
/ 18 октября 2011

Я хочу записать файл из моего фильтра и затем прочитать его в Eclipse, чтобы убедиться, что я записал в него правильно.

Этот код компилируется и работает нормально, но я не знаю, куда мне обратиться, чтобы прочитать файл, или я вообще что-то написал.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;

    System.out.println("filter invoked");

    InputStream in = null;
    OutputStream out = null;
    String inPath = context.getRealPath("/WEB-INF/template.txt");
    String outPath = context.getRealPath("/WEB-INF/output.txt");
    in = new FileInputStream(inPath);
    out = new FileOutputStream(outPath);

    OutputStreamWriter outstream = new OutputStreamWriter(out);
    outstream.write("hello");


    // pass the request along the filter chain
    chain.doFilter(request, response);
}

Файлы template.txt и output.txt находятся в каталоге WEB-INF. Я проверил, что чтение из файлов работает нормально, но я не могу подтвердить запись в них. Каждый раз, когда я пишу в файл output.txt, в файл все равно не вносятся изменения.

Что я не понимаю о записи в файлы в среде веб-приложений?

Ответы [ 3 ]

3 голосов
/ 18 октября 2011

Вы должны закрыть свой поток (который также очистит его) (сделайте это в блоке finally).Кстати, вы можете использовать commons-io FileUtils или guava Files, что облегчит обработку файлов

Однако, общая практика заключается в том, чтобы не писатьфайлы в каталоге webapp, потому что вы потеряете их при следующем повторном развертывании.Выберите / настройте внешнее местоположение для их хранения.

1 голос
/ 18 октября 2011

Также не забудьте обернуть его в блок try finally.

OutputStreamWriter outstream = new OutputStreamWriter(out);
try {
    outstream.write("hello");
} finally {
    outstream.close();
}
0 голосов
/ 26 декабря 2018

Вы можете использовать что-то вроде ниже и позволить попробовать с ресурсами для обработки потока

@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;

        HttpServletResponse response = (HttpServletResponse) servletResponse;
        System.out.println(httpRequest.getRequestURI());
        System.out.println(httpRequest.getRequestURI().toLowerCase().endsWith("/v2/api-docs"));
        ByteArrayPrinter pw = new ByteArrayPrinter();
        // here i create a response wrapper
        HttpServletResponse wrappedResp = new HttpServletResponseWrapper(response) {
            @Override
            public PrintWriter getWriter() {
                return pw.getWriter();
            }

            @Override
            public ServletOutputStream getOutputStream() {
                return pw.getStream();
            }

        };
        System.out.println("before chaingin");
        // i get the response data from the stream
        chain.doFilter(httpRequest, wrappedResp);
        byte[] bytes = pw.toByteArray();
        String respBody = new String(bytes);
        System.out.println("in if" + respBody);
        if (httpRequest.getParameter("group") != null) {



            byte[] newByte = pw.toByteArray();
            String newString = new String(newByte);
            System.out.println("new string:" + newString);
            // i make a modification in the stream
            String s = newString.replaceAll("basePath", "Vijayy");
            System.out.println("printing s" + s);

            // here i try to write to a file with the modification
            try (FileOutputStream fos = new FileOutputStream(
                    new File(System.getProperty("user.dir") + "/static/openAPI.json"))) {
                System.out.println("comin in if");
                fos.write(s.getBytes());


                FileCopyUtils.copy(
                        new FileInputStream(new File(System.getProperty("user.dir") + "/static/openAPI.json")),
                        response.getOutputStream());

            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            }
            // FileCopyUtils.copy(, out);

            // IOUtils.copy(new ByteArrayInputStream(newString.getBytes()), response.getOutputStream());

        } else {
            chain.doFilter(httpRequest, wrappedResp);
            response.setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE);
            response.setContentLength(respBody.length());
            response.getOutputStream().write(respBody.getBytes());
        }

         return;
    }

ByteArrayprinter - это оболочка, которую я создал для PrintStream для моего варианта использования. Опять же, это не должно быть рассмотрено в вашем случае

...