除了上面的方式 , 我们还可以使用下面的方式去得到文件的元数据:
public void attrTest02() throws IOException {Path path = Paths.get("."); // 传入的参数就是文件或者目录的路径 这个传入的就是当前目录PosixFileAttributes attr = Files.readAttributes(path, PosixFileAttributes.class, NOFOLLOW_LINKS);System.out.println(attr.owner()); // 打印用户名System.out.println(attr.group()); // 打印用户组名System.out.println(attr.isRegularFile()); // 是不是一般文件System.out.println(attr.isSymbolicLink()); // 是不是一个符号链接System.out.println(attr.isDirectory()); // 是否是目录System.out.println(attr.isOther()); //其他类型System.out.println(attr.permissions()); // 打印文件的权限 是否可读 可写 可执行System.out.println(attr.lastAccessTime()); // 上一次访问时间System.out.println(attr.creationTime()); // 创建时间System.out.println(attr.lastModifiedTime()); // 上一次修改时间System.out.println(attr.fileKey()); // 打印文件其他相关参数 主要是设备id和inode编号System.out.println(attr.size()); // 文件的大小}
root // 这里是用户名root // 这里是用户组名falsefalsetruefalse[GROUP_READ, OTHERS_EXECUTE, OWNER_WRITE, OWNER_EXECUTE, OTHERS_READ, OWNER_READ, GROUP_EXECUTE]2022-10-09T18:08:47.791072133Z2022-10-09T13:10:51Z2022-10-09T18:08:23.746949182Z(dev=1000012,ino=16176823)192
文件权限在Java当中给我们提供了一个类表示文件的9中权限(文件的作者的读写执行 , 作者所在组的读写执行 , 和其他人的读写执行 , 一共九种权限):
package java.nio.file.attribute;public enum PosixFilePermission {/*** Read permission, owner. 作者读权限*/OWNER_READ,/*** Write permission, owner. 作者写权限*/OWNER_WRITE,/*** Execute/search permission, owner. 作者的执行权限*/OWNER_EXECUTE,/*** Read permission, group. 作者所在组的读权限*/GROUP_READ,/*** Write permission, group.作者所在组的写权限*/GROUP_WRITE,/*** Execute/search permission, group.*/GROUP_EXECUTE,/*** Read permission, others. 其他人读权限*/OTHERS_READ,/*** Write permission, others. 其他人写权限*/OTHERS_WRITE,/*** Execute/search permission, others. 其他人执行权限*/OTHERS_EXECUTE;}
在上面查看文件或者目录的元数据的时候我们已经得到的文件的所有权限信息:
System.out.println(attr.permissions());//[GROUP_READ, OTHERS_EXECUTE, OWNER_WRITE, OWNER_EXECUTE, OTHERS_READ, OWNER_READ, GROUP_EXECUTE]
函数返回的是一个集合set
, 里面存放的就是文件的各种权限的信息 , 比如在我们的例子当中我们可以看到 , 有组读 , 其他人执行 , 作者自己写 , 作者执行 , 其他人读 , 作者读权限 , 如果我们想判断某种权限 , 只需要看看集合当中是否包含即可 。
完整代码实现在上面我们已经谈到了所有的关于实现 ls 命令的细节了 , 接下来看一下我们的代码实现:
import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.attribute.PosixFileAttributes;import java.nio.file.attribute.PosixFilePermission;import java.util.Objects;import java.util.Set;import static java.nio.file.LinkOption.NOFOLLOW_LINKS;public class LS {public static boolean hasRight(Set<PosixFilePermission> set, PosixFilePermissionpermission) {return set.contains(permission);}public static void echoCharacter(Set<PosixFilePermission> set) {// userif (hasRight(set, PosixFilePermission.OWNER_READ))System.out.print('r');elseSystem.out.print('-');if (hasRight(set, PosixFilePermission.OWNER_WRITE))System.out.print('w');elseSystem.out.print('-');if (hasRight(set, PosixFilePermission.OWNER_EXECUTE))System.out.print('x');elseSystem.out.print('-');// groupif (hasRight(set, PosixFilePermission.GROUP_READ))System.out.print('r');elseSystem.out.print('-');if (hasRight(set, PosixFilePermission.GROUP_WRITE))System.out.print('w');elseSystem.out.print('-');if (hasRight(set, PosixFilePermission.GROUP_EXECUTE))System.out.print('x');elseSystem.out.print('-');// othersif (hasRight(set, PosixFilePermission.OTHERS_READ))System.out.print('r');elseSystem.out.print('-');if (hasRight(set, PosixFilePermission.OTHERS_WRITE))System.out.print('w');elseSystem.out.print('-');if (hasRight(set, PosixFilePermission.OTHERS_EXECUTE))System.out.print('x');elseSystem.out.print('-');}public static void echoType(PosixFileAttributes attributes) {if (attributes.isDirectory())System.out.print('d');else if (attributes.isRegularFile())System.out.print('-');else if (attributes.isSymbolicLink())System.out.print('l');elseSystem.out.print('o');}public static void echoFileInformation(String args) throws IOException {Path path = Paths.get(args);PosixFileAttributes attributes = Files.readAttributes(path, PosixFileAttributes.class, NOFOLLOW_LINKS);echoType(attributes);echoCharacter(attributes.permissions());System.out.printf("\t%-2d", Files.getAttribute(path, "unix:nlink"));System.out.print("\t" + attributes.owner().getName());System.out.print("\t" + attributes.group().getName());System.out.printf("\t%-5d", attributes.size());System.out.printf("\t %10s", attributes.lastAccessTime());System.out.println("\t" + path.getFileName());}public static void main(String[] args) throws IOException {File file = new File(args[0]);for (File listFile : Objects.requireNonNull(file.listFiles())) {echoFileInformation(listFile.toString());}}}
经验总结扩展阅读
- 动态编译库 Natasha 5.0 兼容版本发布
- 让自己独立的句子
- 江上秋风动客情的意思
- 蜂鸟是国家保护动物吗
- 兄弟打印机如何自己加粉
- 逸动加什么机油
- 机动车登记证书有什么用
- 四字佳句
- 朋友看不了自己朋友圈怎么办
- 多大年龄考驾照