If you want to read a file using Java AsynchronousFileChannel, following sample code might help you to get started.
package com.ruchira.samples;
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.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class AsyncReader {
public static void main(String[] args) throws
IOException, InterruptedException, ExecutionException {
String fileName = "/Users/ruchira/Downloads/README.md";
completionHandler(fileName);
future(fileName);
}
private static void completionHandler(String fileName)
throws InterruptedException, IOException, ExecutionException {
final Thread current = Thread.currentThread();
final StringBuilder content = new StringBuilder();
Path path = Paths.get(fileName);
final AsynchronousFileChannel ch = AsynchronousFileChannel.open(path);
final ByteBuffer buf = ByteBuffer.allocate(1024);
ch.read(buf, 0, 0,
new CompletionHandler() {
public void completed(Integer result, Integer length) {
if (result == -1) {
try {
ch.close();
} catch (IOException e) {
//ignored
}
current.interrupt();
return;
}
buf.flip();
content.append(new String(buf.array()));
/*while (buf.hasRemaining()) {
content.append((char) buf.get());
}*/
buf.clear();
ch.read(buf, length, length + result, this);
}
public void failed(Throwable exc, Integer length) {
System.out.println("Failure: " + exc.toString());
}
}
);
System.out.println("You can use this thread for another task");
try {
current.join();
} catch (InterruptedException e) {
//ignored
}
System.out.println(content);
}
private static void future(String fileName)
throws InterruptedException, IOException, ExecutionException {
StringBuilder content = new StringBuilder();
int start = 0;
Path path = Paths.get(fileName);
AsynchronousFileChannel ch = AsynchronousFileChannel.open(path);
ByteBuffer buf = ByteBuffer.allocate(1024);
Future result = ch.read(buf, start);
int length;
while ((length = result.get()) != -1) {
while (!result.isDone()) {
System.out.println("You can use this thread for another task");
Thread.sleep(100);
}
buf.flip();
content.append(new String(buf.array()));
/*while (buf.hasRemaining()) {
content.append((char) buf.get());
}*/
buf.clear();
result = ch.read(buf, start);
start += length;
}
ch.close();
System.out.println(content);
}
}