关于java中的流的问题

时间:2011-06-01 09:51:30

标签: java web-applications servlets inputstream outputstream

我们有以下要求。

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

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

我们如何解决这个问题?是否有任何流可以通过它来读取和写入,而无需在两者之间关闭。

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

请看ServletResponse.getOutputStream()

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

无论您使用什么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());
// ...

Apache POI for Excel:

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

答案 4 :(得分:0)

让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