Просто используйте StreamingOutput
в качестве объекта Response
.
interface StreamingOutput {
void write(OutputStream out);
}
Вы просто реализуете этот интерфейс и передаете его методу Response.ok()
. В этом случае вы просто оберните OutputStream
в OutputStreamWriter
, чтобы вы могли передать его методу CsvMapper.writeValues(Writer)
.
StreamingOutput entity = new StreamingOutput() {
@Override
public void write(OutputStream out) {
Writer writer = new BufferedWriter(
new OutputStreamWriter(out, StandardCharsets.UTF_8));
csvWriter(myArrList, writer);
out.flush();
}
};
return Response.ok(entity)
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"RadioObjectData.csv\"")
.build();
Это все, что тебе нужно. Нет необходимости в промежуточном хранении.
Обновление
Если вы хотите, чтобы Base64 кодировал файл CSV, вы можете записать в ByteArrayOutputStream
и использовать эти байты для кодирования с классом Base64
. После того, как он закодирован, просто запишите закодированные байты в StreamingOutput
OutputStream
. Вот пример.
StreamingOutput entity = new StreamingOutput() {
@Override
public void write(OutputStream out) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedWriter baosWriter = new BufferedWriter(
new OutputStreamWriter(baos, StandardCharsets.UTF_8));
csvWriter(myArrList, baosWriter);
byte[] bytes = baos.toByteArray();
byte[] base64Encoded = Base64.getEncoder().encode(bytes);
out.write(base64Encoded);
out.flush();
}
};