ByteArrayOutputStream for PrintWriter (Java Servlet)

Writing created PDF (ByteArrayOutputStream) to Servlet for PrintWriter.

I am desperately looking for a way to write the generated PDF file to PrintWriter response. Since the filter up the hierarchy chain has already called response.getWriter (), I cannot get response.getOutputStream ().

I have a ByteArrayOutputStream where I generated a PDF. Now all I need is a way to output the contents of this ByteArrayOutputStream to PrintWriter. If anyone could give me a helping hand, that would be greatly appreciated!

+3
source share
4 answers

- getWriter, , , . , PrintWriter - ... getOutputStream - , , , , getWriter, .

+7

, PrintWriter? Latin-1, -1 PrintWriter,

   String latin1 = byteStream.toString("ISO-8859-1");
   response.getWriter().write(latin1);

, , .

0

, , , .

(?), , .

, , - Java, , , .

, , HttpServletResponseWrapper / "" response.getWriter() , .

, response.getWriter(), - PrintWriter, response.getWriter() , .

, response.getWriter(), .

, , .

, , response.getWriter(), . , - , PDF.

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;

public class BrokenWriterGetterFixingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, final ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest, new BrokenWriterGetterFixingResponseWrapper((HttpServletResponse) servletResponse));
    }

    @Override
    public void destroy() {
    }

    private static class BrokenWriterGetterFixingResponseWrapper extends HttpServletResponseWrapper {
        public BrokenWriterGetterFixingResponseWrapper(HttpServletResponse response) {
            super(response);
        }

        @Override
        public PrintWriter getWriter() throws IOException {
            return new PrintWriter(new BrokenWriterGetterFixingWriter(getResponse()));
        }
    }

    private static class BrokenWriterGetterFixingWriter extends Writer {
        private PrintWriter responseWriter;
        private final ServletResponse response;

        public BrokenWriterGetterFixingWriter(ServletResponse response) {
            this.response = response;
        }

        @Override
        public void write(char[] cbuf, int off, int len) throws IOException {
            getResponseWriter().write(cbuf, off, len);
        }

        @Override
        public void flush() throws IOException {
            getResponseWriter().flush();
        }

        @Override
        public void close() throws IOException {
            getResponseWriter().close();
        }

        private PrintWriter getResponseWriter() throws IOException {
            if (null == responseWriter) {
                responseWriter = response.getWriter();
            }
            return responseWriter;
        }

    }
}
0
source

I was getting an error, for example:

nothing below this lineError 500: java.lang.IllegalStateException: SRVE0199E: already received OutputStream

Solved by installing:

response.getOutputStream().write(bytes);
response.setContentLength(bytes.length);

Now the output will be:

nothing below this line

-1
source

Source: https://habr.com/ru/post/1742805/


All Articles