1 /* 2 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * - Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * - Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * - Neither the name of Oracle nor the names of its 16 * contributors may be used to endorse or promote products derived 17 * from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * This source code is provided to illustrate the usage of a given feature 34 * or technique and has been deliberately simplified. Additional steps 35 * required for a production-quality application, such as security checks, 36 * input validation and proper error handling, might not be present in 37 * this sample code. 38 */ 39 40 41 import java.nio.ByteBuffer; 42 import java.nio.charset.Charset; 43 import java.nio.file.*; 44 import java.nio.file.attribute.*; 45 import java.io.IOException; 46 47 /** 48 * Example code to list/set/get/delete the user-defined attributes of a file. 49 */ 50 51 public class Xdd { 52 53 static void usage() { 54 System.out.println("Usage: java Xdd <file>"); 55 System.out.println(" java Xdd -set <name>=<value> <file>"); 56 System.out.println(" java Xdd -get <name> <file>"); 57 System.out.println(" java Xdd -del <name> <file>"); 58 System.exit(-1); 59 } 60 61 public static void main(String[] args) throws IOException { 62 // one or three parameters 63 if (args.length != 1 && args.length != 3) 64 usage(); 65 66 Path file = (args.length == 1) ? 67 Paths.get(args[0]) : Paths.get(args[2]); 68 69 // check that user defined attributes are supported by the file store 70 FileStore store = Files.getFileStore(file); 71 if (!store.supportsFileAttributeView(UserDefinedFileAttributeView.class)) { 72 System.err.format("UserDefinedFileAttributeView not supported on %s\n", store); 73 System.exit(-1); 74 75 } 76 UserDefinedFileAttributeView view = 77 Files.getFileAttributeView(file, UserDefinedFileAttributeView.class); 78 79 // list user defined attributes 80 if (args.length == 1) { 81 System.out.println(" Size Name"); 82 System.out.println("-------- --------------------------------------"); 83 for (String name: view.list()) { 84 System.out.format("%8d %s\n", view.size(name), name); 85 } 86 return; 87 } 88 89 // Add/replace a file's user defined attribute 90 if (args[0].equals("-set")) { 91 // name=value 92 String[] s = args[1].split("="); 93 if (s.length != 2) 94 usage(); 95 String name = s[0]; 96 String value = s[1]; 97 view.write(name, Charset.defaultCharset().encode(value)); 98 return; 99 } 100 101 // Print out the value of a file's user defined attribute 102 if (args[0].equals("-get")) { 103 String name = args[1]; 104 int size = view.size(name); 105 ByteBuffer buf = ByteBuffer.allocateDirect(size); 106 view.read(name, buf); 107 buf.flip(); 108 System.out.println(Charset.defaultCharset().decode(buf).toString()); 109 return; 110 } 111 112 // Delete a file's user defined attribute 113 if (args[0].equals("-del")) { 114 view.delete(args[1]); 115 return; 116 } 117 118 // option not recognized 119 usage(); 120 } 121 } 122