NIO feedback

John Hendrikx hjohn at
Wed Oct 14 09:22:38 PDT 2009

I hope you don't mind me sending to the list, but I figured I'd share 
some things while working with NIO2 and perhaps gain a bit more insight 
in its workings.  The project I'm working on may be a slightly unusual 
use-case for NIO2 in that it isn't just an application that wants to 
access the filesystem.  It is more of a file management system.

Reading Attributes:

I found there is no way to just get all attributes that a filesystem can 
provide, or find out what the "most specific" AttributeView is that a 
filesystem provides.  Something like:


is not allowed.  That's ok, so I went looking for a way to figure out 
what system I'm running on... should I get "dos:*" or "posix:*" or even 
something else entirely.. I don't know.  The Linux system I use here 
gives me the following possible views when I do:


It results in [basic, owner, user, dos, unix, posix] which confuses me.  
Why is "dos" in there?  So I tried querying it.  I get a 
FileSystemException (/temp: Operation not supported).

For now in my application I simply query several views. Any that throw 
an exception or result in an empty map are ignored.  I'm left wondering 
if there is a better way.

Writing Attributes:

Above I managed to read the attributes in some fashion.  Now I want to 
set them.  I discovered some of the attributes (like "attributes" in 
dos) are read only.  So instead I query 
"readOnly,hidden,archive,system", not really optimal.  Especially 
because I cannot find a way to set multiple attributes at once.  I'm 
left with:

  for(String key : attributes.keySet()) {
     destinationPath.setAttribute(type + ":" + key, attributes.get(key), 

Again, is there a better way?  What I'm trying to achieve is to simply 
make an exact copy of a file, including most attributes, 
lastModifiedTime, ACL's and owner/group information.  Setting half a 
dozen attributes in a row seems akward.


I cannot read ACL's at all under Linux (ext3), I get an 
UnsupportedOperationException.  I hope support for this is still 


These are not very useful for me, I'd like to give feedback during this 
process (progress indicator). 

Also, I really miss a rename function on the Path class.  Currently it 
is important for my application to know when a moveTo will simply be a 
quick rename, or when it involves actually doing a copy (in which case I 
want to do it manually to give progress information).   I have to 
compare FileStores to see if it will be a copy or just a plain rename 
(not sure how much of a guarantee that is though).  The ATOMIC_MOVE 
option is unclear whether this will mean "just a rename" and/or "yes 
we'll do an-hour-long-copy transactionally if the filesystem supports it".

Still, NIO2 is definitely allowing me to do what I want with the various 
filesystems out there.  Sometimes it feels a little akward, but I've not 
found anything yet that I couldn't achieve with it.

Any tips are appreciated :)

More information about the nio-dev mailing list