Gerar arquivo de texto e enviar pela response

Olá povo,

Eu quero saber se tem como eu gerar um arquivo de texto e enviá-lo pela response sem precisar salvá-lo em disco.
O único modo que eu consegui fazer foi:

            List<LinhasArquivoTexto> linhas = new ArrayList<LinhasArquivoTexto>();
            PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("arquivo.txt")));
            
            for(LinhasArquivoTexto l : linhas) writer.print(l.gerarLinha());
            
            writer.flush();
            writer.close();
            
            response.setContentType("application/plain");
            response.setHeader("Content-Disposition","attachment; filename=arquivo.txt");
            
            File arquivo = new File("arquivo.txt");
            FileInputStream reader = new FileInputStream(arquivo);
            
            byte[] b = new byte[(int)arquivo.length()];
            reader.read(b);
            
            OutputStream saida = response.getOutputStream();
            saida.write(b);
            saida.flush();
            
            reader.close();

Tem algum modo mais simples???

Alguma coisa do tipo.

response.sendRedirect("arquivo.txt");

Não te resolve ??

Mais ou menos… é q eu tenho q gravar o arquivo em disco pra depois conseguir enviá-lo…
Eu gostaria de enviar sem precisar gravar.

Lógico, tua dica já economizou metade do meu trabalho :smiley:

tem esse, é meio parecido

public void sendStringWithName(String send, String name, HttpServletResponse response) throws IOException { byte[] report = send.getBytes(); response.setContentType("application/save"); response.setContentLength(report.length); response.setHeader("Content-Disposition", "attachment; filename=\"" + name+"\""); response.addHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(report, 0, report.length); outputStream.flush(); outputStream.close(); }

Mas de onde vem esse arquivo ?
Qual o tamanho dele ?

Esse metodo eu coloquei numa classe utilitaria,

eu utilizo struts, na minha action eu montei o arquivo utilizando StringBuffer

Eu to gerando um arquivo de texto q será importado para um outro sistema tosco e véio lá de outra empresa.
É baseado em algumas informações q vem de um relatório que fica com um nº N de linhas.

Então eu vou gerar o arquivo a partir de um relatório, ele não existe previamente.

Vou testar teu método avsouza … já digo se funcionou!

Funcionou quase 100%…
O arquivo vem perfeitamente como eu queria, mas da um erro

15:05:39,405 ERROR [action]:250 - Servlet.service() for servlet action threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
        at org.apache.catalina.connector.Response.getWriter(Response.java:601)
        at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196)
        at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
        at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
        at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
        at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
        at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:177)
        at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:116)
        at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:76)
        at org.apache.jsp.arquivo_jsp._jspService(arquivo_jsp.java:135)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:594)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:505)
        at org.apache.struts.action.RequestProcessor.doInclude(RequestProcessor.java:1116)
        at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:260)
        at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
        at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
        at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:834)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
        at java.lang.Thread.run(Thread.java:619)

vc ta abrindo por uma popup?

não, direto por um

<html:form action="/gerar_arquivo" method="POST">
    <script>document.forms[0].submit()</script>
</html:form>

esperimenta fazer abrindo uma popup.

Mesma coisa :?
Eu achei umas discussões sobre esse erro falando q pode ser relacionado ao ContentType por ocorrerem várias declarações dele (na página e depois na Action) mas mesmo tirando da página o erro continua…

vou dizer o q tenho.

  • uma jsp, onde tem a opção para o usuario baixar o arquivo. nela tem um submit para uma action
  • um action (struts) nela eu crio meu stringBuffer e envio para
    this.sendStringWithName(arvivoStringBuffer,“nome Arquivo”,response);
    retunr null;

Tá do mesmo jeito q o teu esquema aí, mas no meu da erro =D
Sei lá… vo continuar procurando a causa e a solução… qd encontrar eu posto aqui.
Vlw pela ajuda!