自己动手写ls命令——Java版( 二 )

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]【自己动手写ls命令——Java版】函数返回的是一个集合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());}}}上面的代码很短,如果大家了解了上main所谈到的api的话 , 就应该很容易理解了 。下面我们看看程序的输出结果:

自己动手写ls命令——Java版

文章插图
可以看到我们的程序的输出结果和ls命令的输出结果是一样的,只是在时间的表示上有所差别而已,这一点没什么关系 。

推荐阅读