如果你发现 NIO.2 内置的属性视图不能满足你的要求,或者你想给文件设置某些特殊的属性,那么你可以使用自定义属性视图。NIO.2 提供了 UserDefinedFileAttributeView 接口来支持这个功能。使用这个视图,你可以添加任何你认为有用的文件属性。
检查是否支持自定义文件属性
在你要创建自己的文件属性之前,要先检验文件系统是否支持这个功能。可以调用 FileStore.supportsFileAttributeView() 方法来进行检验,这个方法接受一个 String 类型的参数,可以传入视图名称进行检验,也接受 Class 类型的参数,可传入视图的 Class 进行检验。下面看看样例:
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/
分享到:
相关推荐
Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...
New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...
Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...
根据提供的文件信息,“Pro Java 7 NIO.2.pdf”由Anghel Leonard于2011年编写,主要介绍了Java 7中的新输入/输出(NIO)API,特别是NIO.2(JSR 203)所带来的增强功能。这本书通过一系列章节详细讲解了如何使用NIO.2...
本篇我们将深入探讨NIO.2中的几个关键概念和类,包括`Files`, `Path`, `FileAttributes`, `DirectoryWatcher`以及`FileVisitor`。这些组件极大地增强了Java对操作系统文件系统的访问能力。 首先,`Path`接口是NIO.2...
java nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava ...
Java I/O, NIO, 和 NIO.2 是Java平台中处理输入/输出操作的核心组件,对于任何Java开发者来说,理解和掌握这些概念至关重要。本文将深入探讨这些技术,旨在提供一个全面而详尽的概述。 Java I/O(Input/Output)是...
`Pro Java 7 NIO.2`这本书由Anghel Leonard著,深入探讨了Java NIO.2 API,这是Java 7引入的进一步扩展,包括: 1. **文件系统API增强**:新增了AsynchronousFileChannel,支持异步文件操作,可以在后台线程中执行...
缓冲区则用于存储和传输数据,它是NIO的关键组件,具有容量、位置、限制等属性,并支持多种操作,如读写、反转、清除等。选择器允许单个线程同时监控多个通道,当某个通道准备进行读写操作时,选择器会通知我们,...
This book covers all the important aspects involved in developing NIO.2-based applications. It provides clear instructions for getting the most out of NIO.2 and offers many exercises and case studies ...
Java NIO.pdf nio教程 Java NIO.pdf nio教程 java nio
蔚来(NIO.US)新车上市,蔚来可期 蔚来(NIO.US)是一家中国的新能源汽车制造商,专注于生产高性能的电动汽车。 公司的目标是成为中国最大的新能源汽车品牌,并且跻身全球汽车行业的前列。 蔚来2025年目标价45.5...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO具有更好的性能和更高的灵活性。NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。...
【java.nio.file库详解】 Java 早期版本的文件I/O操作功能相对有限,存在几个显著问题:不支持现代文件系统特性、API设计复杂且冗长、处理大文件和并发性能不足。为了解决这些问题,Java引入了`java.nio.file`库,...
Pro Java 7 NIO.2 – PDF Books