我有接受byte[]作为RequestBody的RestApi端点。但是,它使用太多内存。如何读取这个大字节[]数组?
有没有更好的方法可以做到这一点?
我目前不起作用的解决方案如下:
控制器:
@RequestMapping(value = "person", method = RequestMethod.POST)public
void postPerson(@RequestBody() byte[] data) {
PersonService.postPerson(data);
}
服务:
public void postPerson(byte[] data) {
Splitter sp = new Splitter();
sp.splitFile(data, (bytes) -> {
});
}
接口:
public interface Splitter {
void splitFile(byte[] data, Consumer<byte[]> segmentConsumer);
}
分配器:
public void splitFile(byte[] data, Consumer<byte[]> segmentConsumer){
try {
XMLInputFactory xmlif = XMLInputFactory.newInstance();
final XMLEventReader reader = xmlif.createXMLEventReader(new
ByteArrayInputStream(data), StandardCharsets.ISO_8859_1.name());
String fileHeader = "";
StringBuilder aggregatedSegments = new StringBuilder();
int segmentCount = 0;
while (reader.hasNext()) {
final XMLEvent event = reader.nextEvent();
if (isStartElement(event, "status")) {
fileHeader = buildHeader(event, reader);
}
if (isStartElement(event, "person")) {
segmentCount++;
aggregatedSegments.append(buildSegment(event, reader));
if (maxNrOfElementsInSegment == segmentCount) {
segmentConsumer.accept(buildFile(fileHeader, aggregatedSegments));
aggregatedSegments = new StringBuilder();
segmentCount = 0;
}
}
}
if (segmentCount != 0) {
segmentConsumer.accept(buildFile(fileHeader, aggregatedSegments));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@RequestMapping(value = "", method = RequestMethod.POST)
public void postTransportEvent(HttpServletRequest request) {
File streamedFile = new File("test.xml");
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
FileOutputStream outputStream = new FileOutputStream(streamedFile);
byte[] buffer = new byte[10240];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
outputStream.close();
}
inputFileStream.close();
} catch (IOException e) {
log.error(e.toString(), e);
} finally {
streamedFile.delete();
}