Асинхронный сервлет для загрузки файлов - предпочтительная реализация - PullRequest
0 голосов
/ 11 февраля 2019

В последнее время, во время моих исследований об асинхронной обработке в сервлетах, у меня есть два способа загрузки файлов.Но я не знаю, что лучше.

Первое: сначала прочитайте файл, а затем начните писать

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) {}
        });
    });
}

Они все работают правильно, но какой из них быстрее?Спасибо за ваш ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...