@RequestMapping("/test")
fun getData(): ResponseEntity {
val items = repository.getItems()
val outputStream = ByteArrayOutputStream()
myService.writeData(items, outputStream)
val byteArrayData = outputStream.toByteArray()
outputStream.close() // ---------> Do I have to close here as well?
ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.header(
HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=file.csv"
)
.body(byteArrayData)
}
< /code>
, а также < /p>
fun writeData(items: List, outputStream: ByteArrayOutputStream) {
CSVPrinter(
outputStream.writer(),
CSVFormat.DEFAULT
).use { csvPrinter ->
items.forEachIndexed { index, it ->
csvPrinter.printRecord(…)
}
}
Возникает несколько вопросов:
Нужно ли мне также закрывать выходной поток при использовании .use функция на CSVPrinter? .use должен выполнить закрытие, просто не уверен, закрыт ли это выходной поток...
Когда выполнять выводStream.toByteArray? Можно ли это сделать после закрытия потока?
Ранее я использовал StringBuilder для создания настоящего файла .csv, но он вызывал некоторые ошибки OutOfMemory. После перехода на потоковую передачу данных использование кучи не намного улучшилось... Чего мне не хватает?
У меня есть этот код. < /p> [code]@RequestMapping("/test") fun getData(): ResponseEntity { val items = repository.getItems() val outputStream = ByteArrayOutputStream()
myService.writeData(items, outputStream) val byteArrayData = outputStream.toByteArray()
outputStream.close() // ---------> Do I have to close here as well?
ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) .header( HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=file.csv" ) .body(byteArrayData) } < /code> , а также < /p> fun writeData(items: List, outputStream: ByteArrayOutputStream) { CSVPrinter( outputStream.writer(), CSVFormat.DEFAULT ).use { csvPrinter -> items.forEachIndexed { index, it -> csvPrinter.printRecord(…) } } [/code] Возникает несколько вопросов: [list] [*]Нужно ли мне также закрывать выходной поток при использовании .use функция на CSVPrinter? .use должен выполнить закрытие, просто не уверен, закрыт ли это выходной поток... [*]Когда выполнять выводStream.toByteArray? Можно ли это сделать после закрытия потока? [*]Ранее я использовал StringBuilder для создания настоящего файла .csv, но он вызывал некоторые ошибки OutOfMemory. После перехода на потоковую передачу данных использование кучи не намного улучшилось... Чего мне не хватает? [/list]