Sorry to be the bearer of bad news - but I think what you are going to run into here is performance limitations of Java IO. You can (and should) use NIO to do relatively quick file transfers now - but operations that involve querying the file system for meta data (i.e. get directory listings, determine which entry is a file, it's modified date, etc...) are horribly inefficient. For example, when you call File.isDirectory() then File.canWrite() it actually makes the same low level system call twice, applying different masks in each case. On a network with even modest latency, all these little reads can really add up.
The good news is that JDK 7 addresses these issues with an alternative mechanism for interacting with the file system.
Long and short: you won't find a Java implementation that can come close to a native app for this sort of thing - at least not until JDK 7 ships. Obviously, you could write JNI code to pull this off, but if you are doing that, you might as well write the entire app native and be done with it.