Вопрос касательно потоков в java - PullRequest
2 голосов
/ 01 июня 2011

У нас есть следующее требование.

Нам нужно будет создать отчет в формате Excel / PDF, а затем загрузить его одним нажатием кнопки в веб-приложении Java.Файл pdf / excel создается динамически с использованием данных приложения.

Мы не должны создавать какие-либо физические файлы на сервере.

Как нам поступить?Есть ли потоки, через которые я могу читать и писать в одно и то же время, не закрывая их между собой?

Ответы [ 5 ]

4 голосов
/ 01 июня 2011

Вы можете использовать основанные на памяти потоки (такие как ByteArrayInputStream и ByteArrayOutputStream) и использовать один и тот же базовый байтовый буфер для адресации чтения / записи в одной и той же части вопроса.

Как уже отмечали другие, вы можете просто записывать напрямую в выходной поток ответа.

2 голосов
/ 01 июня 2011

Посмотрите на ServletResponse.getOutputStream().

Вам нужно написать в этот поток с того, который создан вашим API отчета.Не забудьте установить правильный content-type, используя setContentType() метод того же класса.

1 голос
/ 01 июня 2011

Независимо от того, какой API PDF или Excel вы используете для генерации файлов, вы должны найти конструктор или метод, который требует OutputStream для записи сгенерированного содержимого PDF / Excel. Вы должны просто накормить его response.getOutputStream() вместо FileOutputStream.

Например, iText для PDF:

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

И Apache POI для Excel:

response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
WritableWorkbook workBook = Workbook.createWorkbook(response.getOutputStream());
// ...
1 голос
/ 01 июня 2011

Здесь вы можете найти, как вы можете сделать это с помощью API jxl, и это также может вам помочь. Как вывести файл Excel из сервлета?

0 голосов
/ 01 июня 2011

Пусть сервлет обслуживает файл 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();
}

Тип MIME для файлов MS Excel будет application/vnd.ms-excel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...