Adicionar extensão em um arquivo que está em memória

Pessoal bom dia/tarde/noite/madrugada, to precisando da ajuda de vocês! :grin:
Eu quero adicionar extensão a um conjunto de byte que estão em memória, não quero gravar o arquivo em disco, pois essa operação é custosa, então quero adicionar a extensão pdf aos relatórios que eu gero com essa função abaixo:

public byte[] getRelatorio(String nomeArquivoDoRelatorio, Map<String, Object> parametros) throws JRException, FileNotFoundException, SQLException {
    byte[] relatorio = null;
    String path = getPath(nomeArquivoDoRelatorio);
    Connection connection;
    try {
        connection = Dao.getConnection();
        JasperPrint jp = JasperFillManager.fillReport(path, parametros, connection);
        relatorio = JasperExportManager.exportReportToPdf(jp);
        Dao.closeConnection(connection);
    } catch (JRException | SQLException e) {
        throw e;
    }
    return relatorio;
}

Observações:

  • A chamada ao método getPath() só pega o caminho para o arquivo jrxml que é usado pra plotar o relatório.

  • O método Dao.getConnection() e o Dao.closeConnection() abrem e fecham a conexão com o banco respectivamente.

Gostaria muito de continuar retornando o byte[], pois envio o relatório gerado via HTTP.
Importante:
Quando gero um relatório consigo adicionar extensão nele assim:

    response.setHeader("Content-Disposition", "attachment;filename=lista_" + request.getParameter("cursoSelecionado") + ".pdf");
    response.setContentType("application/pdf");

Contudo quando gero varios relatórios e zipo eles, eles ficam apenas como arquivos dentro do zip, pois tenho que adicionar a extensão do zip no response, faço isso assim:

    response.setHeader("Content-Disposition", "attachment;filename=certificados.zip");
    response.setContentType("application/zip");

Agradeço a todos de uma vez e aguardo alguma ideia!
Abs!

Vc pode compactar os arquivos como no link:

Use o ByteArrayOutputStream para converter a saída em byte[]:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
saida = new ZipOutputStream(baos);

como os arquivos não estão em disco:

entry = new ZipEntry("relatorio.pdf");
saida.putNextEntry(entry);
saida.write(relatorio); //  relatorio é um array de bytes

depois

byte[] zipBytes = baos.toByteArray();