diff options
Diffstat (limited to 'src/main/java/io/skas/melbjvm/nio2/AsynchronousFileReader.java')
| -rw-r--r-- | src/main/java/io/skas/melbjvm/nio2/AsynchronousFileReader.java | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/main/java/io/skas/melbjvm/nio2/AsynchronousFileReader.java b/src/main/java/io/skas/melbjvm/nio2/AsynchronousFileReader.java index ff7c82b..273ddc5 100644 --- a/src/main/java/io/skas/melbjvm/nio2/AsynchronousFileReader.java +++ b/src/main/java/io/skas/melbjvm/nio2/AsynchronousFileReader.java @@ -18,7 +18,6 @@ public class AsynchronousFileReader implements CompletionHandler<Integer, ByteBu public static final Logger LOG = LoggerFactory.getLogger(AsynchronousFileReader.class); public static final int BYTES_IN_MEGABYTE = 1048576; - private Long position; private Path path; private ByteBuffer buffer; @@ -36,31 +35,41 @@ public class AsynchronousFileReader implements CompletionHandler<Integer, ByteBu } private void openChannel() { + try { this.asynchronousFileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ); } catch (IOException e) { e.printStackTrace(); } + } private void closeChannel() { + try { this.asynchronousFileChannel.close(); } catch (IOException e) { e.printStackTrace(); } + } private void readChannel(long position) { + asynchronousFileChannel.read(buffer, position, buffer, this); + } @Override public void completed(Integer result, ByteBuffer buffer) { + if (result < 0) { + closeChannel(); LOG.debug("read: {} megabytes", position / BYTES_IN_MEGABYTE); + } else { + position += result; if (buffer.hasRemaining()) { readChannel(position); @@ -70,12 +79,16 @@ public class AsynchronousFileReader implements CompletionHandler<Integer, ByteBu buffer.clear(); this.readChannel(position); } + } + } @Override public void failed(Throwable exc, ByteBuffer buffer) { + LOG.error("read failed: {}", exc.getMessage()); exc.printStackTrace(); + } } |
