JavaSE: How to SET/GET your own Files and Directory Attributes
In the previous article “Determining Views Supported by a Particular File System” and see how to ask the file system store, and see supportability of a particular file attribute view.
We are going to explore in a nutshell, one of the most advanced and important files attribute views which is User-Defined File Attributes View.
Particularly, I am using this feature a lot in my exchanged files during integration between my systems, to hide my files meta-data and security related information from users and contents of the file. So the file content will be only regarding the content of the file only, no more irrelevant meta-data.
Therefore If you find that there are not enough built-in attributes for your needs or if you have some unique meta-data (meaningful to the file system) that you want to associate with a file, you can define your own attributes.
NIO.2 offers the user-defined file attributes view, extended attributes through the UserDefinedFileAttributeView
interface. This facility allows you to associate to a file any attribute that you consider to be useful for your use cases.
Here you should know how to:
- Check User-Defined Attributes Supportability
- Operations on User-Defined Attributes as the following:
- Define a User Attribute.
- List User-Defined Attribute Names and Value Sizes.
- Get the Value of a User-Defined Attribute.
- Delete a File’s User-Defined Attribute.
Here is the class that has operations defined previously, also you need to use JDK 7+:
import static java.lang.System.err; import static java.lang.System.out; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import static java.nio.file.Files.getFileStore; import java.nio.file.Path; import static java.nio.file.Paths.get; import java.nio.file.attribute.UserDefinedFileAttributeView; /** * GET/SET FILES METADATA THROUGH THE NEW JAVA.NIO.FILE.ATTRIBUTE API. * * @author mohamed_taman * * @see java.nio.file.attribute * @see java.nio.file.Files */ public class MetadataOperations { private static FileSystem fs = FileSystems.getDefault(); private static Path path = get("C:", "workspace/NIO2", "resources", "TOC.txt"); public static void main(String... args) { //User-Defined File Attributes View | userDefinedViewsOperations(); } private static void userDefinedViewsOperations() { try { // Check User-Defined Attributes Supportability if (getFileStore(path) .supportsFileAttributeView(UserDefinedFileAttributeView.class)) { // 1- Define a User Attribute. UserDefinedFileAttributeView udfav = Files.getFileAttributeView(path, UserDefinedFileAttributeView.class); out.println("Attrs. before deletion. its size: " + udfav.list().size()); for (String name : udfav.list()) { out.println(udfav.size(name) + " " + name); } int written = udfav.write("file.description", Charset.defaultCharset(). encode("This file contains private information about HOL2846!")); // 2- List User-Defined Attribute Names and Value Sizes. for (String name : udfav.list()) { out.println(udfav.size(name) + " " + name); } // 3- Get the Value of a User-Defined Attribute. int size = udfav.size("file.description"); ByteBuffer bb = ByteBuffer.allocateDirect(size); udfav.read("file.description", bb); bb.flip(); out.println(Charset.defaultCharset().decode(bb).toString()); /** * Note: Using the UserDefinedFileAttributeView.size() method, * you can easily set the correct size of the buffer that represents * the value of the user-defined attribute. * * Note: You can also read an attribute by using the getAttribute() method. * The value is returned as byte array (byte[]). * */ // 4- Delete a File’s User-Defined Attribute. out.println("Attrs. before deletion."); for (String name : udfav.list()) { out.println(udfav.size(name) + " " + name); } udfav.delete("file.description"); out.println("Attrs. after deletion."); for (String name : udfav.list()) { out.println(udfav.size(name) + " " + name); } } else { out.println(path.toAbsolutePath().toString() + ", Doesn't support user defined attributes."); } } catch (Exception e) { err.println(e); } } }
Resources
- JavaSE 7,8: Determining Views Supported by a Particular File System
- JSR 203: More New I/O APIs for the JavaTM Platform (“NIO.2”)
- Java SE tutorial: File I/O (Featuring NIO.2)
Reference: | JavaSE: How to SET/GET your own Files and Directory Attributes from our JCG partner Mohamed Taman at the Improve your life Through Science and Art blog. |