欢迎访问www.allbetgaming.com!

首页科技正文

欧博电脑版:小师妹学JavaIO之:目录照样文件

admin2020-06-074

目录
  • 简介
  • linux中的文件和目录
  • 目录的基本操作
  • 目录的进阶操作
  • 目录的腰疼操作
  • 总结

简介

目录和文件傻傻分不清楚,目录和文件的本质到底是什么?在java中怎么操作目录,怎么遍历目录。本文F师兄会为人人逐一讲述。

linux中的文件和目录

小师妹:F师兄,我最近有一个疑惑,java代码中似乎只有文件没有目录呀,是不是当初发现java的大神,一不小心走了神?

F师兄:小师妹真勇气可嘉呀,敢于质疑权威是从小工到专家的最主要的一步。想想F师兄我,从小没人提点,先生讲什么我就信什么,专家说什么我就听什么:股市必上一万点,屋子是给人住的不是给人炒的,原油宝当然是小白理财必备产物....然后,就没有然后了。

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等连续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-连续更新
  • Spring 5.X系列教程:知足你对Spring5的一切想象-连续更新
  • java程序员从小工到专家成神之路(2020版)-连续更新中,附详细文章教程

更多内容请接见www.flydean.com

虽然java中没有目录的观点只有File文件,而File实在是可以示意目录的:

public boolean isDirectory()

File中有个isDirectory方式,可以判断该File是否是目录。

File和目录傻傻分不清楚,小师妹,有没有遐想到点什么?

小师妹:F师兄,我记得你上次讲到Linux下面所有的资源都可以看做是文件,在linux下面文件和目录的本质是不是一样的?

对的,在linux下面文件是一等公民,所有的资源都是以文件的形式来区分的。

什么扇区,逻辑块,页之类的底层结构我们就不讲了。我们先考虑一下一个文件到底应该包罗哪些内容。除了文件自己的数据之外,另有很多元数据的器械,好比文件权限,所有者,group,建立时间等信息。

在linux系统中,这两个部门是离开存储的。存放数据自己的叫做block,存放元数据的叫做inode。

inode中存储了block的地址,可以通过inode找到文件现实数据存储的block地址,从而举行文件接见。考虑一下大文件可能占用很多个block,以是一个inode中可以存储多个block的地址,而一个文件通常来说使用一个inode就够了。

为了显示层级关系和利便文件的治理,目录的数据文件中存放的是该目录下的文件和文件的inode地址,从而形成了一种一环套一环,圆环套圆环的链式关系。

上图列出了一个通过目录查找其下文件的环中环结构。

我想java中目录没有单独列出来一个类的缘故原由可能是参考了linux底层的文件结构吧。

目录的基本操作

由于在java中目录和文件是公用File这个类的,以是File的基本操作目录它全都会。

基本上,目录和文件相比要多注重下面三类方式:

public boolean isDirectory()
public File[] listFiles() 
public boolean mkdir() 

为什么说是三类呢?由于另有几个和他们对照靠近的方式,这里就不逐一列举了。

isDirectory判断该文件是不是目录。listFiles列出该目录下面的所有文件。mkdir建立一个文件目录。

小师妹:F师兄,之前我们还以目录的遍历要花费对照长的时间,经由你一解说目录的数据结构,感受listFiles并不是一个耗时操作呀,所有的数据都已经准备好了,直接读取出来就行。

对,看问题不要看外面,要看到隐藏在外面的本质内在。你看师兄我平时不显山露水,实在是真正的中流砥柱,堪称公司优异员工模范。

小师妹:F师兄,那平时也没看上头表彰你啥的?哦,我懂了,一定是老板怕表彰了你引起别人的嫉妒,会让你的好好大师兄的形象崩塌吧,看来老板真的懂你呀。

目录的进阶操作

好了小师妹,你懂了就行,下面F师兄给你讲一下目录的进阶操作,好比我们怎么拷贝一个目录呀?

小师妹,拷贝目录简朴的F师兄,上次你就教我了:

cp -rf

一个下令的事情不就解决了吗?岂非内里还隐藏了点隐秘?

咳咳咳,隐秘倒是没有,小师妹,我记得你上次说要对java从一而终的,今天师兄给你先容一个在java中拷贝文件目录的方式。

实在Files工具类里已经为我们提供了一个拷贝文件的优异方式:

public static Path copy(Path source, Path target, CopyOption... options)

使用这个方式,我们就可以举行文件的拷贝了。

若是想要拷贝目录,就遍历目录中的文件,循环挪用这个copy方式就够了。

小师妹:且慢,F师兄,若是目录下面另有目录的,目录下还套目录的情形该怎么处置?

这就是圈套呀,看我用个递归的方式解决它:

public void useCopyFolder() throws IOException {
        File sourceFolder = new File("src/main/resources/flydean-source");
        File destinationFolder = new File("src/main/resources/flydean-dest");
        copyFolder(sourceFolder, destinationFolder);
    }

    private static void copyFolder(File sourceFolder, File destinationFolder) throws IOException
    {
        //若是是dir则递归遍历建立dir,若是是文件则直接拷贝
        if (sourceFolder.isDirectory())
        {
            //查看目的dir是否存在
            if (!destinationFolder.exists())
            {
                destinationFolder.mkdir();
                log.info("目的dir已经建立: {}",destinationFolder);
            }
            for (String file : sourceFolder.list())
            {
                File srcFile = new File(sourceFolder, file);
                File destFile = new File(destinationFolder, file);
                copyFolder(srcFile, destFile);
            }
        }
        else
        {
            //使用Files.copy来拷贝详细的文件
            Files.copy(sourceFolder.toPath(), destinationFolder.toPath(), StandardCopyOption.REPLACE_EXISTING);
            log.info("拷贝目的文件: {}",destinationFolder);
        }
    }

基本思想就是遇到目录我就遍历,遇到文件我就拷贝。

目录的腰疼操作

小师妹:F师兄,如果我想删除一个目录中的文件,或者我们想统计一下这个目录下面到底有多少个文件该怎么做呢?

虽然这些操作有点腰疼,照样可以解决的,Files工具类中有个方式叫做walk,返回一个Stream工具,我们可以使用Stream的API来对文件举行处置。

删除文件:

public void useFileWalkToDelete() throws IOException {
        Path dir = Paths.get("src/main/resources/flydean");
        Files.walk(dir)
                .sorted(Comparator.reverseOrder())
                .map(Path::toFile)
                .forEach(File::delete);
    }

统计文件:

 public void useFileWalkToSumSize() throws IOException {

        Path folder = Paths.get("src/test/resources");
        long size = Files.walk(folder)
                .filter(p -> p.toFile().isFile())
                .mapToLong(p -> p.toFile().length())
                .sum();
        log.info("dir size is: {}",size);
    }

总结

本文先容了目录的一些异常常见和有用的操作。

本文的例子https://github.com/ddean2009/learn-java-io-nio

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/java-io-directory/

本文泉源:flydean的博客

迎接关注我的民众号:程序那些事,更多精彩等着您!

,

欧博开户

www.114co.cn欢迎进入欧博开户平台(Allbet Game),欧博开户平台开放欧博Allbet开户、欧博Allbet代理开户、欧博Allbet电脑客户端、欧博AllbetAPP下载等业务。

本文链接:https://www.zhaoyuan777.com/post/887.html

网友评论

最新评论