У меня есть требование извлекать и записывать тысячи записей из БД, конвертировать в json и записывать в zip-файл. Я могу написать ниже, а также реализацию.
@Override
public StreamingResponseBody fetchAndWriteOrderAllocationsToFile(LocalDate date) {
int orderCount = orderDao.getOrderCount(date);
// Pagination
return outputStream -> {
try (ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(outputStream))) {
zipOut.putNextEntry(new ZipEntry("report.txt"));
int startIndex = 0, count = orderCount;
do {
List<String> orderSerialNos = orderDao.getOrderSerialNos(date, startIndex, PAGESIZE);
orderSerialNos.parallelStream().forEach(orderSerialNo -> {
try {
writeToStream(zipOut, allocationsService.getAllocationsFromOrderItems(orderSerialNo), objectMapper);
} catch (Exception e) {
writeToStream(zipOut, Allocations.builder()
.orderSerialNo(orderSerialNo)
.build(), objectMapper);
}
});
count -= PAGESIZE;
startIndex += PAGESIZE;
} while (count > 0);
}
};
}
private static void writeToStream(OutputStream outputStream,
Object result,
ObjectMapper objectMapper) {
try {
objectMapper.writeValue(outputStream, result);
} catch (IOException e) {
log.error("Error writing results to stream", e);
}
}
Однако я хотел бы ввести символ новой строки (или запятую) после каждой записи json в файл. Самым близким, что я получил, было переопределение метода PrettyPrinter.writeEndObject
к чему-то подобному ниже и использование переопределенного класса PrettyPrinter
. Это, очевидно, добавляет новый символ строки ко всем подобъектам json, а также к каждому новому json. Ожидается, что символ новой строки будет только после каждого json. Есть ли способ выполнить sh это?
@Override
public void writeEndObject(JsonGenerator g, int nrOfEntries) throws IOException {
g.writeRaw("}\n");
}
Выше код дает:
{"orderSerialNo":"1234-ABCD","orderId":1,"shippingAllocations":[{"recipientId":25,"itemId":3893814,"itemSku":"ABC","quantity":1,"shippingItemId":3893815,"shippingSku":"DEF","shipperId":66,"allocation":0}
],"sdAllocations":[],"idAllocations":[]}
{"orderSerialNo":"6789-EFGH","orderId":2,"shippingAllocations":[{"recipientId":45,"itemId":88,"itemSku":"BLAH","quantity":1,"shippingItemId":78,"shippingSku":"HELP","shipperId":99,"allocation":7.95}
],"sdAllocations":[],"idAllocations":[]}
Ожидается:
{"orderSerialNo":"1234-ABCD","orderId":1,"shippingAllocations"[{"recipientId":25,"itemId":3893814,"itemSku":"ABC","quantity":1,"shippingItemId":3893815,"shippingSku":"DEF","shipperId":66,"allocation":0}],"sdAllocations":[],"idAllocations":[]}
{"orderSerialNo":"6789-EFGH","orderId":2,"shippingAllocations":[{"recipientId":45,"itemId":88,"itemSku":"BLAH","quantity":1,"shippingItemId":78,"shippingSku":"HELP","shipperId":99,"allocation":7.95}],"sdAllocations":[],"idAllocations":[]}