Учебники

Java NIO — AsynchronousFileChannel

Поскольку мы знаем, что Java NIO поддерживает параллелизм и многопоточность, что позволяет нам одновременно работать с разными каналами. Таким образом, API, ответственный за это в пакете Java NIO, — это AsynchronousFileChannel, который определен в пакете каналов NIO. для AsynchronousFileChannel — это java.nio.channels.AsynchronousFileChannel .

AsynchronousFileChannel аналогичен FileChannel NIO, за исключением того, что этот канал позволяет файловым операциям выполняться асинхронно, в отличие от операции синхронного ввода-вывода, в которой поток входит в действие и ожидает завершения запроса. Таким образом, асинхронные каналы безопасны для использования. несколькими параллельными потоками.

В асинхронном запросе поток передается ядру операционной системы, чтобы выполнить его, в то время как поток продолжает обрабатывать другое задание. Как только задание ядра выполнено, он сигнализирует потоку, затем поток подтверждает сигнал и прерывает текущее задание и обрабатывает Работа ввода / вывода по мере необходимости.

Для достижения параллелизма этот канал предоставляет два подхода, один из которых заключается в возврате объекта java.util.concurrent.Future, а другой — в передачу операции типа java.nio.channels.CompletionHandler .

Мы разберем оба подхода с помощью примеров один за другим.

  • Future Object — в этом случае экземпляр Future Interface возвращается из канала. В Future interface есть метод get (), который возвращает состояние операции, которая обрабатывается асинхронно, на основе которой может быть принято решение о дальнейшем выполнении другой задачи. Мы можем также проверьте, выполнена ли задача или нет, вызвав ее метод isDone .

Future Object — в этом случае экземпляр Future Interface возвращается из канала. В Future interface есть метод get (), который возвращает состояние операции, которая обрабатывается асинхронно, на основе которой может быть принято решение о дальнейшем выполнении другой задачи. Мы можем также проверьте, выполнена ли задача или нет, вызвав ее метод isDone .

пример

В следующем примере показано, как использовать объект Future и выполнять асинхронные задачи.

package com.java.nio;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class FutureObject {
   public static void main(String[] args) throws Exception {
      readFile();
   }
   private static void readFile() throws IOException, InterruptedException, ExecutionException {
      String filePath = "D:fileCopy.txt";
      printFileContents(filePath);
      Path path = Paths.get(filePath);		
      AsynchronousFileChannel channel =AsynchronousFileChannel.open(path, StandardOpenOption.READ);
      ByteBuffer buffer = ByteBuffer.allocate(400);
      Future<Integer> result = channel.read(buffer, 0); // position = 0
      while (! result.isDone()) {
         System.out.println("Task of reading file is in progress asynchronously.");
      }
      System.out.println("Reading done: " + result.isDone());
      System.out.println("Bytes read from file: " + result.get()); 
      buffer.flip();
      System.out.print("Buffer contents: ");
      while (buffer.hasRemaining()) {
         System.out.print((char) buffer.get());                
      }
      System.out.println(" ");
      buffer.clear();
      channel.close();
   }
   private static void printFileContents(String path) throws IOException {
      FileReader fr = new FileReader(path);
      BufferedReader br = new BufferedReader(fr);
      String textRead = br.readLine();
      System.out.println("File contents: ");
      while (textRead != null) {
         System.out.println("     " + textRead);
         textRead = br.readLine();
      }
   fr.close();
   br.close();
   }
}

Выход

File contents: 
   To be or not to be?
   Task of reading file is in progress asynchronously.
   Task of reading file is in progress asynchronously.
   Reading done: true
   Bytes read from file: 19
   Buffer contents: To be or not to be? 
  • Обработчик завершения

    Этот подход довольно прост, поскольку в этом мы используем интерфейс CompletionHandler и переопределяем два его метода: один метод complete (), который вызывается при успешном завершении операции ввода-вывода, а другой — метод fail (), который вызывается, если операции ввода-вывода fails.In при этом создается обработчик для использования результата асинхронной операции ввода-вывода, поскольку после завершения задачи только обработчик имеет функции, которые выполняются.

Обработчик завершения

Этот подход довольно прост, поскольку в этом мы используем интерфейс CompletionHandler и переопределяем два его метода: один метод complete (), который вызывается при успешном завершении операции ввода-вывода, а другой — метод fail (), который вызывается, если операции ввода-вывода fails.In при этом создается обработчик для использования результата асинхронной операции ввода-вывода, поскольку после завершения задачи только обработчик имеет функции, которые выполняются.

пример

В следующем примере показано, как использовать CompletionHandler для асинхронной задачи.