Какая польза от CompletionHandler в AsynchronousFileChannel для чтения данных?

Я работаю с AsynchronousFileChannel для чтения данных. Для чтения данных я нашел два метода чтения следующим образом:

//1.
Future<Integer> java.nio.channels.AsynchronousFileChannel.read(ByteBuffer dst, long position);

//2.
void java.nio.channels.AsynchronousFileChannel.read(ByteBuffer dst, long position, A attachment, CompletionHandler<Integer, ? super A> handler)

Как указано в документации Java, как указано ниже, нет информации о том, что CompletionHandler используется в качестве третьего параметра функции:

Считывает последовательность байтов из этого канала в указанный буфер, начиная с указанной позиции файла.

Этот метод инициирует чтение последовательности байтов из этого канала в заданный буфер, начиная с заданной позиции файла. Результатом чтения является число прочитанных байтов или -1, если заданная позиция больше или равна размеру файла во время попытки чтения.

Этот метод работает так же, как и метод AsynchronousByteChannel.read(ByteBuffer, Object, CompletionHandler), за исключением того, что байты читаются, начиная с указанной позиции файла. Если заданная позиция файла больше, чем размер файла во время попытки чтения, то никакие байты не читаются.

Кто-нибудь может дать мне знать о третьем параметре и любом рабочем примере для CompletionHandler? Зачем нам нужен CompletionHandler и для чего он нужен?

1 ответ

Решение

Вот пример, который я искал и заставил его работать следующим образом:

try(AsynchronousFileChannel asyncfileChannel = AsynchronousFileChannel.open(Paths.get("/Users/***/Documents/server_pull/system_health_12_9_TestServer.json"), StandardOpenOption.READ)){
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        ByteBuffer attachment = ByteBuffer.allocate(1024);
        asyncfileChannel.read(buffer, 0, attachment, new CompletionHandler<Integer, ByteBuffer>() {
            @Override
            public void completed(Integer result, ByteBuffer attachment) {
                System.out.println("result = " + result);

                attachment.flip();
                byte[] data = new byte[attachment.limit()];
                attachment.get(data);
                System.out.println(new String(data));
                attachment.clear();
            }

            @Override
            public void failed(Throwable exc, ByteBuffer attachment) {

            }
        });
    }catch(Exception e){
        e.printStackTrace();
    }

И ниже детали обработки:

После завершения операции чтения будет вызван метод complete () CompletionHandler. В качестве параметров в метод complete () передается целое число, указывающее, сколько байтов было прочитано, и "вложение", которое было передано методу read(). "Вложение" - это третий параметр метода read(). В данном случае это был ByteBuffer, в который также считываются данные.

Если операция чтения завершится неудачно, будет вызван метод fail () класса CompletionHandler.

Другие вопросы по тегам