【问题标题】:Question regarding streams in java关于java中流的问题
【发布时间】:2011-09-06 03:46:52
【问题描述】:

我们有以下要求。

我们必须创建一个 excel/pdf 报告,然后通过单击 Java Web 应用程序中的按钮下载它。 pdf/excel 文件是使用应用程序数据动态创建的。

我们不应在服务器上创建任何物理文件。

我们该怎么做呢?是否有任何流可以让我同时读取和写入,而无需在两者之间关闭。

【问题讨论】:

  • 为什么你需要读写同一个流? (或者也许我误解了你的问题......)

标签: java web-applications servlets inputstream outputstream


【解决方案1】:

您可以使用基于内存的流(例如ByteArrayInputStream 和ByteArrayOutputStream)并使用相同的底层字节缓冲区来解决问题的同一部分中的读/写问题。

正如其他人指出的那样,您可以直接写入响应的输出流。

【讨论】:

  • 我知道的每个 Web 框架都可以访问 OutputStream 来写入您的响应,那么我为什么要先将结果缓存在字节数组中呢?
  • 我试图回答“我可以同时读取和写入的任何流,而不必在两者之间关闭”。不过你完全是在写,你可以直接写到 web 框架的输出流。
  • 上面有 2 个不同的对象(输入和输出流)。我想要的是一个流中的两种功能。有可能吗?
  • @vinoth:不,我害怕。顺便说一句,即使是,您认为您将如何达到预期的效果?
  • 抱歉,我在 OPs 问题中错过了这一点。那么你是对的,将ByteArray* 与共享的后备数组一起使用是执行此操作的直接方法。 (虽然我怀疑这对于生成 PDF 或其他东西非常有用)
【解决方案2】:

看ServletResponse.getOutputStream()。

您需要从您的报告 API 创建的流中写入此流。不要忘记使用同一类的setContentType() 方法设置正确的content-type。

【讨论】:

    【解决方案3】:

    在这里您可以找到如何使用 jxl API 来实现它,它也可能对您有所帮助。 How do I output an Excel file from a Servlet?

    【讨论】:

      【解决方案4】:

      无论您使用什么 PDF 或 Excel API 来生成文件,您都应该查找使用 OutputStream 将生成的 PDF/Excel 内容写入其中的构造函数或方法。你应该用response.getOutputStream() 而不是 FileOutputStream 来喂它。

      例如,用于 PDF 的 iText:

      response.setContentType("application/pdf");
      response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
      PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
      // ...
      

      以及用于 Excel 的 Apache POI:

      response.setContentType("application/vnd.ms-excel");
      response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
      WritableWorkbook workBook = Workbook.createWorkbook(response.getOutputStream());
      // ...
      

      【讨论】:

        【解决方案5】:

        让 Servlet 将 pdf/excel 文件作为字节数组提供。

        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    
            byte[] bytes = null; // get this from somewhere in your app
            String fileName = "filename.pdf"; // whatever you wish to name the file
        
            ServletOutputStream out = response.getOutputStream();
            response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
            response.setContentType("application/pdf");
            response.setContentLength(bytes.length);
            out.write(bytes);
            out.flush();
        }
        

        MS Excel 文件的 MIME 类型为 application/vnd.ms-excel。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-19
          • 2017-12-02
          • 2011-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-26
          相关资源
          最近更新 更多