自己动手写ls命令——Java版介绍在前面的文章Linux命令系列之ls——原来最简单的ls这么复杂当中,我们仔细的介绍了关于ls命令的使用和输出结果,在本篇文章当中我们用Java代码自己实现ls命令,更加深入的了解ls命令 。
代码实现文件操作的基本原理如果我们使用Java实现一个简单的ls命令其实并不难,因为Java已经给我们提供了一些比较方便和文件系统相关的api了,困难的是理解api是在做什么事儿!
事实上这些api都是操作系统给我们提供的,然后Java进行了一些列的封装,将这些操作给我们进行提供,我们仔细来看一下封装的层次,首先操作系统会给我们提供很多系统调用用于和设备(磁盘、CPU)进行交互,比如说和文件的交互就是读写数据 , 当然我们的Java程序也需要这些操作,因此JVM也需要给我们提供这些操作,因此JVM就对系统调用进行了一系列的封装,在Java当中具体的形式就是用native修饰的方法 。
![自己动手写ls命令——Java版](http://img.zhejianglong.com/231018/0F3464227-0.png)
文章插图
如果你是一个比较有经验Java程序员那么一定见过Java当中的
native
方法,这些方法都是Java给我们封装的底层接口,比如说在FileInputStream
当中有一个read
方法,这个方法就是读取文件当中的内容,我们看一下这个方法是如何实现的:public int read() throws IOException {return read0();}
这里让大家的感受更加深入一点,我在这里贴一张FileInputStream
的源代码图片:![自己动手写ls命令——Java版](http://img.zhejianglong.com/231018/0F34A109-1.png)
文章插图
从上面的图看当我们调用
FileInputStream
方法的时候确实调用了native方法 。我们再来看一些与文件操作相关的api,他们也是使用Java给我们封装的native方法实现的 。![自己动手写ls命令——Java版](http://img.zhejianglong.com/231018/0F3461314-2.png)
文章插图
上面主要谈了一些基本的文件操作过程的原理,简要说明了Java将很多系统操作封装成native方法供我们调用,现在我们来看看要想实现ls命令,我们需要哪些api 。
查看一个目录下面有哪些文件和目录在Java当中给我们提供了一个类
File
, 我们可以使用这个类去得到一个目录下面有哪些文件和目录 。public void fileTest() {File file = new File("./");// file.listFiles() 将当前 file 对应的目录下所有的文件和目录都得到for (File listFile : file.listFiles()) {System.out.println(listFile.getName()); // 将文件或者目录的名字打印}
查看文件和目录的元数据在Java当中给我们提供了一个工具类查看文件的一些元信息(metadata) , 比如说文件的uid(用户id)、gid(用户组id)、文件的大小和文件的链接数目(nlink) 。Path path = Paths.get(".");System.out.println(Files.getAttribute(path, "unix:dev")); // 打印存储当前目录数据的设备的设备idSystem.out.println(Files.getAttribute(path, "unix:ino")); // 打印存储当前目录数据inode号System.out.println(Files.getAttribute(path, "unix:mode"));// 打印存储当前目录数据的mode数据 这个数据主要用于表示文件的类型System.out.println(Files.getAttribute(path, "unix:uid")); // 打印存储当前目录所属用户的用户idSystem.out.println(Files.getAttribute(path, "unix:gid")); // 打印存储当前目录所属组的组idSystem.out.println(Files.getAttribute(path, "unix:size"));// 打印存储当前目录数据所占的空间大小System.out.println(Files.getAttribute(path, "unix:nlink"));// 打印存储当前目录数据的链接数
除了上面的方式,我们还可以使用下面的方式去得到文件的元数据: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()); // 文件的大小}
推荐阅读
- 动态编译库 Natasha 5.0 兼容版本发布
- 实时营销引擎在vivo营销自动化中的实践 | 引擎篇04
- 笔仙三人怎么玩(笔仙3男女互动)
- 一 网络安全主动进攻之DNS基础和ettercap实现DNS流量劫持
- Java核心技术阅读笔记 java中的自动拆装箱与缓存
- 驱动开发:内核取ntoskrnl模块基地址
- 使用 Spring Security 手动验证用户
- 王者荣耀五谷满仓活动怎么玩
- 浅谈-动态路由之OSPF的理解
- 去越南必买的十件东西,值得买的越南特产排名,越买越心动