Статьи

JavaSE: как УСТАНОВИТЬ / ПОЛУЧИТЬ свои собственные файлы и атрибуты каталога

В предыдущей статье «Определение представлений, поддерживаемых определенной файловой системой» и посмотрите, как запросить хранилище файловой системы, а также посмотрите поддерживаемость конкретного представления атрибута файла.

Вкратце мы рассмотрим один из самых сложных и важных видов атрибутов файлов — представление пользовательских атрибутов файлов .

В частности, я часто использую эту функцию в моих обмениваемых файлах во время интеграции между моими системами, чтобы скрыть метаданные файлов и информацию, связанную с безопасностью, от пользователей и содержимого файла. Таким образом, содержимое файла будет относиться только к содержимому файла, не более ненужных метаданных .

Поэтому, если вы обнаружите, что встроенных атрибутов недостаточно для ваших нужд или если у вас есть какие-то уникальные метаданные ( значимые для файловой системы ), которые вы хотите связать с файлом, вы можете определить свои собственные атрибуты.

NIO.2 предлагает представление пользовательских атрибутов файла, расширенные атрибуты через интерфейс UserDefinedFileAttributeView . Эта возможность позволяет вам связать с файлом любой атрибут, который вы считаете полезным для ваших случаев использования.

Здесь вы должны знать, как:

  1. Проверьте поддержку пользовательских атрибутов
  2. Операции над пользовательскими атрибутами как следующие:
    1. Определите атрибут пользователя.
    2. Список имен пользовательских атрибутов и размеров значений.
    3. Получить значение пользовательского атрибута.
    4. Удалить определяемый пользователем атрибут файла.

Вот класс, у которого есть определенные ранее операции, также вам нужно использовать JDK 7+:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
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);
        }
    }
}

Ресурсы