В последнее время, во время моих исследований об асинхронной обработке в сервлетах, у меня есть два способа загрузки файлов.Но я не знаю, что лучше.
Первое: сначала прочитайте файл, а затем начните писать
private void writeFile1(File f, ServletRequest req) throws IOException {
AsynchronousFileChannel fileChannel = createMyFileChannel(f);
ByteBuffer buffer = ByteBuffer.allocate((int)f.length());
final AsyncContext ctx = req.startAsync();
//ctx.addListener(...);
fileChannel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
ctx.start(() -> {
try {
byte[] bt = attachment.array();
HttpServletResponse res = (HttpServletResponse)ctx.getResponse();
res.getOutputStream().write(bt);
// ...
}
catch (IOException e) {
// ...
}
finally {
ctx.complete();
}
});
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {}
});
}
Второе: сначала начните писать, а затем прочитайте файл
private void writeFile2(File f, ServletRequest req) throws IOException {
AsynchronousFileChannel fileChannel = createMyFileChannel(f);
ByteBuffer buffer = ByteBuffer.allocate((int)f.length());
final AsyncContext ctx = req.startAsync();
//ctx.addListener(...);
ctx.start(() -> {
HttpServletResponse res = (HttpServletResponse)ctx.getResponse();
fileChannel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
try {
byte[] bt = attachment.array();
res.getOutputStream().write(bt);
//...
}
catch (IOException e) {
// ...
}
finally {
ctx.complete();
}
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {}
});
});
}
Они все работают правильно, но какой из них быстрее?Спасибо за ваш ответ.