[NIO.2] 第十八篇 用户自定义属性视图_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > [NIO.2] 第十八篇 用户自定义属性视图

[NIO.2] 第十八篇 用户自定义属性视图

 2014/3/29 21:14:12  cucaracha  程序员俱乐部  我要评论(0)
  • 摘要:如果你发现NIO.2内置的属性视图不能满足你的要求,或者你想给文件设置某些特殊的属性,那么你可以使用自定义属性视图。NIO.2提供了UserDefinedFileAttributeView接口来支持这个功能。使用这个视图,你可以添加任何你认为有用的文件属性。检查是否支持自定义文件属性在你要创建自己的文件属性之前,要先检验文件系统是否支持这个功能。可以调用FileStore.supportsFileAttributeView()方法来进行检验,这个方法接受一个String类型的参数
  • 标签:用户 自定义
如果你发现 NIO.2 内置的属性视图不能满足你的要求,或者你想给文件设置某些特殊的属性,那么你可以使用自定义属性视图。NIO.2 提供了 UserDefinedFileAttributeView 接口来支持这个功能。使用这个视图,你可以添加任何你认为有用的文件属性。

检查是否支持自定义文件属性

在你要创建自己的文件属性之前,要先检验文件系统是否支持这个功能。可以调用 FileStore.supportsFileAttributeView() 方法来进行检验,这个方法接受一个 String 类型的参数,可以传入视图名称进行检验,也接受 Class 类型的参数,可传入视图的 Class 进行检验。下面看看样例:

class="java" name="code">import java.io.IOException; 
import java.nio.file.FileStore; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.UserDefinedFileAttributeView; 
… 
Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); 
 
try { 
    FileStore store = Files.getFileStore(path); 
    if (!store.supportsFileAttributeView(UserDefinedFileAttributeView.class)) { 
      System.out.println("The user defined attributes are not supported on: " + store); 
    } else { 
      System.out.println("The user defined attributes are supported on: " + store); 
    } 
} catch (IOException e) { 
    System.err.println(e); 
}


当然,你也可以通过 FileSystem 来获取 FileStore,这样可以检验所有的 FileStore 是否支持某个属性视图。

自定义属性的操作

如果你的文件系统支持自定义属性。那么就可以进行添加属性、查询属性、删除属性、更新属性的操作。

定义属性

首先我们定义一个名为  file.description 值为 This file contains
private information! 的属性。当你调用 Files.getFileAttributeView() 方法得到文件视图后,可以通过下面的方法写出属性:

import java.io.IOException; 
import java.nio.charset.Charset; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.UserDefinedFileAttributeView; 
… 
Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); 
UserDefinedFileAttributeView udfav = Files.getFileAttributeView(path,  
                                         UserDefinedFileAttributeView.class); 
try { 
    int written = udfav.write("file.description", Charset.defaultCharset(). 
               encode("This file contains private information!")); 
} catch (IOException e) { 
    System.err.println(e); 
}


可以看到 write() 方法接受两个参数,第一个参数表示属性名,第二个参数是 ByteBuffer 类型,表示属性值。如果属性名已经存在,则会被替换。这个方法还返回一个 int 类型的返回值,表示写出的字节数,可以为 0。

也可以通过 Files.setAttribute() 来设置属性,属性值可用 ByteBuffer 类型或 byte 数组类型(byte[])。

获取属性名称和值的大小

在任何时候,你都可以调用 UserDefinedFileAttributeView.list()  方法来列出自定义属性的名称。这个方法返回 List 类型的返回值,List 中用 String 类型存储自定义的属性名。将属性名传入 UserDefinedFileAttributeView.size() 方法可得到属性值的大小,下面看例子

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.UserDefinedFileAttributeView; 
… 
Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); 
UserDefinedFileAttributeView udfav = Files.getFileAttributeView(path,  
                                         UserDefinedFileAttributeView.class); 
 
try { 
    for (String name : udfav.list()) { 
        System.out.println(udfav.size(name) + "     " + name); 
    } 
} catch (IOException e) { 
    System.err.println(e); 
}


获取自定义属性值

可以通过 UserDefinedFileAttributeView.read()  方法来读取自定义属性值,这个方法接受两个参数,类型分别为 String 和 ByteBuffer,Sting 参数传入属性名,ByteBuffer 参数用来存放属性值。下面看看例子:

import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.charset.Charset; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.UserDefinedFileAttributeView; 
… 
Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); 
UserDefinedFileAttributeView udfav = Files.getFileAttributeView(path,  
                                         UserDefinedFileAttributeView.class); 
 
try { 
    int size = udfav.size("file.description"); 
    ByteBuffer bb = ByteBuffer.allocateDirect(size); 
    udfav.read("file.description", bb); 
    bb.flip(); 
    System.out.println(Charset.defaultCharset().decode(bb).toString()); 
} catch (IOException e) { 
    System.err.println(e); 
}


从上面的例子可以看到,使用  UserDefinedFileAttributeView.size() 方法,可以很容易地设置存放属性值的 ByteBuffer 的长度。

另外,也可以通过 Files.getAttribute() 来获取属性值,这会返回 byte 类型的数组(byte[])。

删除自定义属性

当用户自定义的属性不再有用的时候,可以调用 UserDefinedFileAttributeView.delete()  方法来删除属性值。只需传入属性名称即可,下面看看例子:

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.UserDefinedFileAttributeView; 
… 
Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); 
UserDefinedFileAttributeView udfav = Files.getFileAttributeView(path,  
                                         UserDefinedFileAttributeView.class); 
try { 
    udfav.delete("file.description"); 
} catch (IOException e) { 
    System.err.println(e); 
}


文章来源:http://www.aptusource.org/2014/03/nio-2-user-defined-file-attribute-view/
发表评论
用户名: 匿名