diff options
| -rw-r--r-- | src/main/java/io/skas/melbjvm/nio2/App.java | 19 | ||||
| -rw-r--r-- | src/main/java/io/skas/melbjvm/nio2/AsynchronousFileReader.java (renamed from src/main/java/io/skas/melbjvm/nio2/FileReader.java) | 51 | ||||
| -rw-r--r-- | src/main/java/io/skas/melbjvm/nio2/Nio2MetaDataLoggingUtils.java | 8 | ||||
| -rw-r--r-- | src/main/java/io/skas/melbjvm/nio2/Watcher.java | 11 |
4 files changed, 48 insertions, 41 deletions
diff --git a/src/main/java/io/skas/melbjvm/nio2/App.java b/src/main/java/io/skas/melbjvm/nio2/App.java index df6e962..a586247 100644 --- a/src/main/java/io/skas/melbjvm/nio2/App.java +++ b/src/main/java/io/skas/melbjvm/nio2/App.java @@ -7,28 +7,29 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; +/** + * @author Szymon Szukalski [szymon.szukalski@gmail.com] + */ public class App { public static final Logger LOG = LoggerFactory.getLogger(App.class); public static void main(String[] args) throws IOException { - final Path path = Paths.get("/tmp/doit"); + final Path path = Paths.get("/tmp", "doit"); + + Nio2MetaDataLoggingUtils.logFileStoreAttributes(path); + Nio2MetaDataLoggingUtils.logBasicFileAttributes(path); + Nio2MetaDataLoggingUtils.logDosFileAttributes(path); + Nio2MetaDataLoggingUtils.logPosixFileAttributes(path); + Nio2MetaDataLoggingUtils.logFileOwnerAttributes(path); Watcher watcher = new Watcher(); try { - Nio2MetaDataLoggingUtils.logFileStoreAttributes(path); - Nio2MetaDataLoggingUtils.logBasicFileAttributes(path); - Nio2MetaDataLoggingUtils.logDosFileAttributes(path); - Nio2MetaDataLoggingUtils.logPosixFileAttributes(path); - Nio2MetaDataLoggingUtils.logFileOwnerAttributes(path); - watcher.watchDirectory(path); - } catch (IOException | InterruptedException ex) { LOG.error(ex.getMessage()); } } - } diff --git a/src/main/java/io/skas/melbjvm/nio2/FileReader.java b/src/main/java/io/skas/melbjvm/nio2/AsynchronousFileReader.java index 56882ec..ff7c82b 100644 --- a/src/main/java/io/skas/melbjvm/nio2/FileReader.java +++ b/src/main/java/io/skas/melbjvm/nio2/AsynchronousFileReader.java @@ -11,21 +11,24 @@ import java.nio.file.Path; import java.nio.file.StandardOpenOption; /** - * @author Szymon Szukalski [szymon.szukalski@portlandrisk.com] + * @author Szymon Szukalski [szymon.szukalski@gmail.com] */ -public class FileReader implements CompletionHandler<Integer, ByteBuffer> { +public class AsynchronousFileReader implements CompletionHandler<Integer, ByteBuffer> { - public static final Logger LOG = LoggerFactory.getLogger(FileReader.class); + public static final Logger LOG = LoggerFactory.getLogger(AsynchronousFileReader.class); + public static final int BYTES_IN_MEGABYTE = 1048576; - private Long fileSize; + + private Long position; private Path path; private ByteBuffer buffer; private AsynchronousFileChannel asynchronousFileChannel; - public FileReader(Path path) { - this.fileSize = 0L; + public AsynchronousFileReader(Path path) { + this.position = 0L; this.path = path; - this.buffer = ByteBuffer.allocate(1048576); + this.buffer = ByteBuffer.allocate(BYTES_IN_MEGABYTE); + LOG.info("reading {}...", path); this.openChannel(); @@ -40,10 +43,6 @@ public class FileReader implements CompletionHandler<Integer, ByteBuffer> { } } - private void readChannel(long position) { - asynchronousFileChannel.read(buffer, position, buffer, this); - } - private void closeChannel() { try { this.asynchronousFileChannel.close(); @@ -52,24 +51,30 @@ public class FileReader implements CompletionHandler<Integer, ByteBuffer> { } } + private void readChannel(long position) { + asynchronousFileChannel.read(buffer, position, buffer, this); + } + @Override - public void completed(Integer result, ByteBuffer attachment) { - if (result != -1) { - this.fileSize += result; - attachment.flip(); - attachment.clear(); - this.readChannel(this.fileSize); + public void completed(Integer result, ByteBuffer buffer) { + if (result < 0) { + closeChannel(); + LOG.debug("read: {} megabytes", position / BYTES_IN_MEGABYTE); } else { - - LOG.info("... read in: {} bytes from {}", fileSize, path); - attachment.flip(); - attachment.clear(); - this.closeChannel(); + position += result; + if (buffer.hasRemaining()) { + readChannel(position); + } else { + buffer.flip(); + // Do something with the content of the buffer + buffer.clear(); + this.readChannel(position); + } } } @Override - public void failed(Throwable exc, ByteBuffer attachment) { + public void failed(Throwable exc, ByteBuffer buffer) { LOG.error("read failed: {}", exc.getMessage()); exc.printStackTrace(); } diff --git a/src/main/java/io/skas/melbjvm/nio2/Nio2MetaDataLoggingUtils.java b/src/main/java/io/skas/melbjvm/nio2/Nio2MetaDataLoggingUtils.java index 3c2451d..0899d60 100644 --- a/src/main/java/io/skas/melbjvm/nio2/Nio2MetaDataLoggingUtils.java +++ b/src/main/java/io/skas/melbjvm/nio2/Nio2MetaDataLoggingUtils.java @@ -10,6 +10,9 @@ import java.nio.file.Path; import java.nio.file.attribute.*; import java.util.Set; +/** + * @author Szymon Szukalski [szymon.szukalski@gmail.com] + */ public class Nio2MetaDataLoggingUtils { public static final Logger LOG = LoggerFactory.getLogger(Nio2MetaDataLoggingUtils.class); @@ -18,8 +21,6 @@ public class Nio2MetaDataLoggingUtils { public static final String BASIC_VIEW = "basic"; public static final String OWNER_VIEW = "owner"; - public static final String USER_VIEW = "user"; - public static final String UNIX_VIEW = "unix"; public static final String DOS_VIEW = "dos"; public static final String POSIX_VIEW = "posix"; @@ -30,7 +31,6 @@ public class Nio2MetaDataLoggingUtils { BasicFileAttributes basicFileAttributes = Files.readAttributes(path, BasicFileAttributes.class); LOG.info("Basic file attributes for path [{}]", path); - LOG.info(" isDirectory? {}", basicFileAttributes.isDirectory()); LOG.info(" isOther? {}", basicFileAttributes.isOther()); LOG.info(" isRegularFile? {}", basicFileAttributes.isRegularFile()); @@ -88,11 +88,9 @@ public class Nio2MetaDataLoggingUtils { public static void logFileOwnerAttributes(Path path) throws IOException { final FileStore fileStore = Files.getFileStore(path); - if (fileStore.supportsFileAttributeView(OWNER_VIEW)) { final FileOwnerAttributeView fileAttributeView = Files.getFileAttributeView(path, FileOwnerAttributeView.class); LOG.info("Owner file attributes for path [{}]", path); - LOG.info(" principal: {}", fileAttributeView.getOwner()); } else { diff --git a/src/main/java/io/skas/melbjvm/nio2/Watcher.java b/src/main/java/io/skas/melbjvm/nio2/Watcher.java index 2947ef7..1938c9f 100644 --- a/src/main/java/io/skas/melbjvm/nio2/Watcher.java +++ b/src/main/java/io/skas/melbjvm/nio2/Watcher.java @@ -6,6 +6,9 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.file.*; +/** + * @author Szymon Szukalski [szymon.szukalski@gmail.com] + */ public class Watcher { private static final Logger LOG = LoggerFactory.getLogger(Watcher.class); @@ -35,15 +38,15 @@ public class Watcher { final WatchEvent<Path> watchEventPath = (WatchEvent<Path>) watchEvent; Path newFile = watchedPath.resolve(watchEventPath.context()); - if (kind == StandardWatchEventKinds.ENTRY_MODIFY) { - new FileReader(newFile); + if (kind == StandardWatchEventKinds.ENTRY_CREATE) { + new AsynchronousFileReader(newFile); } } - //reset the key + // reset the key boolean valid = key.reset(); - //exit loop if the key is not valid (if the directory was deleted, for example) + // exit loop if the key is not valid (if the directory was deleted, for example) if (!valid) { break; } |
