广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 软件教程 > Java技术 > 正文

惠州什么是Java异步I/O?_北大青鸟IT学校

作者:邓华发布时间:2021-04-14分类:Java技术浏览:1127


导读:相信大家在学习Java的过程都会遇到各种各样的问题,例如:什么是Java异步I/O?那么下面我们一起来看看惠州北大青鸟学术部老师是怎么讲解这道题的。

相信大家在学习Java的过程都会遇到各种各样的问题,例如:什么是Java异步I/O?那么下面我们一起来看看惠州北大青鸟学术部老师是怎么讲解这道题的。

在同步文件I/O中,对I/O操作的请求将等待,直到I/O操作完成。

在异步文件I/O中,I/O操作的请求由系统异步执行。

当系统完成文件I/O时,它通知应用程序其请求的完成。

java.nio.channels.AsynchronousFileChannel类表示异步文件通道。

AsynchronousFileChannel类的静态open()方法获取AsynchronousFileChannel类的实例。

以下代码显示了如何获取WRITE的异步文件通道。

Path  path   = Paths.get("C:\\Java_Dev\\rainbow.txt");
AsynchronousFileChannel afc   = AsynchronousFileChannel.open(path, WRITE,  CREATE);

AsynchronousFileChannel提供了两种方法来处理异步文件I/O操作的结果。

Using a java.util.concurrent.Future object.

Using a java.nio.channels.CompletionHandler object.

支持异步文件I/O操作的AsynchronousFileChannel类的每个方法有两个版本。

一个版本返回一个Future对象,我们可以使用它来处理所请求的异步操作的结果。

Future对象的get()方法返回写入文件通道的字节数。

以下代码使用返回Future对象的write()方法的版本:

ByteBuffer dataBuffer  = a buffer;
long  startPosition = 0;
Future<Integer> result = afc.write(dataBuffer, startPosition);

一旦我们得到一个Future对象,我们可以使用轮询方法或阻塞等待方法来处理异步文件I/O的结果。

下面的代码显示了轮询方法,它将继续调用Future对象的isDone()方法,以检查I/O操作是否完成:

while (!result.isDone()) {
}
int writtenNumberOfBytes = result.get();

AsynchronousFileChannel类的另一个版本的方法获得一个CompletionHandler对象,当请求的异步I/O操作完成或失败时,该对象的方法被调用。

CompletionHandler接口有两个方法:completed()和failed()。

当所请求的I/O操作成功完成时,将调用completed()方法。

当请求的I/O操作时失败,则调用failed()方法。

以下代码使用Attachment类的对象作为完成处理程序的附件:

class  Attachment {    public Path  path;    public  ByteBuffer buffer;    public  AsynchronousFileChannel asyncChannel;
}class MyHandler implements CompletionHandler<Integer,  Attachment>   {
   @Override    public void  completed(Integer result, Attachment attach)  {
       // Handle  completion of  the   I/O  operation
   }
   
   @Override    public void  failed(Throwable e,  Attachment attach)  {
       // Handle  failure of  the   I/O  operation
   }
}

以下代码使用MyHandler实例作为异步写操作的完成处理程序。

MyHandler handler = new MyHandler();
ByteBuffer dataBuffer  = get   a  data buffer;
Attachment attach  = new Attachment();
attach.asyncChannel = afc;
attach.buffer = dataBuffer;
attach.path = path;

// Perform  the   asynchronous write operation
afc.write(dataBuffer, 0, attach, handler);

以下代码演示了如何使用CompletionHandler对象来处理对文件的异步写入的结果。

import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.WRITE;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.channels.CompletionHandler;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;public class Main {  public static void main(String[] args) throws Exception {
   Path path = Paths.get("test.txt");
   AsynchronousFileChannel afc = AsynchronousFileChannel.open(path, WRITE,
       CREATE);
   WriteHandler handler = new WriteHandler();
   ByteBuffer dataBuffer = getDataBuffer();
   Attachment attach = new Attachment();
   attach.asyncChannel = afc;
   attach.buffer = dataBuffer;
   attach.path = path;

   afc.write(dataBuffer, 0, attach, handler);

   System.out.println("Sleeping for 5  seconds...");
   Thread.sleep(5000);
 }  public static ByteBuffer getDataBuffer() {
   String lineSeparator = System.getProperty("line.separator");
   StringBuilder sb = new StringBuilder();
   sb.append("test");
   sb.append(lineSeparator);
   sb.append("test");
   sb.append(lineSeparator);
   String str = sb.toString();
   Charset cs = Charset.forName("UTF-8");
   ByteBuffer bb = ByteBuffer.wrap(str.getBytes(cs));
   return bb;
 }
}class Attachment {  public Path path;  public ByteBuffer buffer;  public AsynchronousFileChannel asyncChannel;
}class WriteHandler implements CompletionHandler<Integer, Attachment> {
 @Override  public void completed(Integer result, Attachment attach) {
   System.out.format("%s bytes written  to  %s%n", result,
       attach.path.toAbsolutePath());    try {
      attach.asyncChannel.close();
   } catch (IOException e) {
     e.printStackTrace();
   }
 }

 @Override  public void failed(Throwable e, Attachment attach) {    try {
     attach.asyncChannel.close();
   } catch (IOException e1) {
     e1.printStackTrace();
   }
 }
}

想了解更多关于Java的资讯,可以来惠州北大青鸟新方舟校区了解一下。

Java15.jpg

Java

标签:惠州计算机JAVA软件开发惠州计算机Java软件开发惠州计算机JAVA培训惠州计算机JAVA软件开发学校惠州计算机Java软件开发培训JAVAJava软件开发北大青鸟IT计算机学校北大青鸟IT软件学校北大青鸟IT学校


Java技术排行
标签列表
网站分类
文章归档
最近发表