summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzymon Szukalski <szymon.szukalski@gmail.com>2012-10-02 21:11:19 +1000
committerSzymon Szukalski <szymon.szukalski@gmail.com>2012-10-02 21:11:19 +1000
commit9c632725afb73bbf0966e52ca50c6d66c12d853b (patch)
treeaa44aaba7f0ce5b2216170b25cc3febaf27f5274
parent6a16552fd38a91076169466328763cf541027e31 (diff)
Re-wrote AsynchronousFileReader.
Various clean-ups.
-rw-r--r--src/main/java/io/skas/melbjvm/nio2/App.java19
-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.java8
-rw-r--r--src/main/java/io/skas/melbjvm/nio2/Watcher.java11
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;
}