无涯教程知道Java NIO支持并发和多线程,这允许同时处理不同的通道,因此Java NIO包中负责此操作的API是AsynchronousFileChannel。
AsynchronousFileChannel与NIO的FileChannel相似,不同之处在于此通道使文件操作能够异步执行。
在异步中,线程将请求传递给操作系统的内核以完成请求,而线程继续处理另一个作业。一旦内核的作业完成,它将向线程发出信号,然后线程确认信号并中断当前作业并处理I/O工作根据需要。
AsynchronousFileChannel示例
以下示例显示了如何使用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示例
下面的示例演示如何使用CompletionHandler异步执行任务。
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.channels.CompletionHandler; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class CompletionHandlerDemo { public static void main (String [] args) throws Exception { writeFile(); } private static void writeFile() throws IOException { String input = "Content to be written to the file."; System.out.println("Input string: " + input); byte [] byteArray = input.getBytes(); ByteBuffer buffer = ByteBuffer.wrap(byteArray); Path path = Paths.get("D:fileCopy.txt"); AsynchronousFileChannel channel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE); CompletionHandler handler = new CompletionHandler() { @Override public void completed(Object result,Object attachment) { System.out.println(attachment + " completed and " + result + " bytes are written."); } @Override public void failed(Throwable exc,Object attachment) { System.out.println(attachment + " failed with exception:"); exc.printStackTrace(); } }; channel.write(buffer, 0, "Async Task", handler); channel.close(); printFileContents(path.toString()); } 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(); } }
运行上面代码输出
Input string: Content to be written to the file. Async Task completed and 34 bytes are written. File contents: Content to be written to the file.
参考链接
https://www.learnfk.com/java-nio/java-nio-asynchronous-filechannel.html
标签:Java,nio,java,无涯,System,AsynchronousFileChannel,file,import,out From: https://blog.51cto.com/u_14033984/9027111