Какая польза от 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.