龙空技术网

张小飞的Java之路——第四十一章——File

小艾编程 120

前言:

现在小伙伴们对“filesjava”都比较珍视,朋友们都想要学习一些“filesjava”的相关文章。那么小编同时在网上汇集了一些有关“filesjava””的相关文章,希望咱们能喜欢,姐妹们快快来了解一下吧!

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?

1. 介绍

诸小亮:从今天开始,我们学习 IO 流

张小飞:IO 流?这是做什么用的?

诸小亮:IO流——就是Input、Output 流,用来处理设备之间的数据传输,比如:

张小飞:数据从内存到硬盘是Output,从硬盘到内存是Input,是这样理解吗?

诸小亮:是的,一个 txt 文件

打开:是记事本程序把数据从硬盘加载到内存中经过处理展现在屏幕上,这是 Input保存:是记事本程序把数据从内存输出到硬盘上,这是Output

张小飞:嗯嗯,好的,不过这个Java 有什么关系呢?

诸小亮:Java中对文件的操作是通过流的方式

流:是系统资源,也可以认为是系统工具,java通过流从硬盘上获取数据,处理后再通过流存储到硬盘上注意:因为流是系统资源,所以使用后需要释放(稍后演示)

张小飞:既然如此,还是赶紧演示一下吧

2. File

诸小亮:我们首先看——File 类

File:是 java 中描述文件和文件夹的类

张小飞:所以,Java中就是通过操作 File 对象,就能操作硬盘上的文件?

诸小亮:是的,学习IO流,就是处理硬盘上的文件,所以先学习 File 类

2.1. 创建File对象

张小飞:那么,怎么使用这个 File 类呢?

诸小亮:我们先看看如何创建对象

2.1.1. 绝对路径

诸小亮:把硬盘上的文件封装成 File 对象,比如:

//将一个具体路径封装成 File 对象File file = new File("G:\\learn\\123.txt");//之所以使用"\\"是因为"\"在java字符串中是转义符

张小飞:我们电脑上没有代码中的文件吧

诸小亮:没关系,创建 File 对象时,提供的路径可以存在,也可以不存在

张小飞:好的

2.1.2. 相对路径

诸小亮:上面创建对象时提供的是绝对路径,也可以封装相对路径,比如:

张小飞:相对路径是???

诸小亮:相对路径依赖于我们 Java 项目所处的位置,比如:

诸小亮:所以它的绝对路径是——G:\lrn\javaDemo\learn\abc.txt

张小飞:可以把它路径给打印出来吗?

诸小亮:可以,使用 getAbsoluteFile() 方法就行了,比如:

结果:

注意:windows中,相对路径以盘符开头,比如:G:\\learn,不以盘符开头的都是相对路径

2.1.3. File(String parent, String child)

诸小亮:另外,通过以下方式也能创建 File 对象

//两个参数:第一个是父路径,第二个是子路径File file = new File("G:\\learn", "123.txt");File file2 = new File("G:\\learn\\123.txt");

张小飞:上面代码中,file 和 file2 表示的是同一个文件吗?

诸小亮:是的

张小飞:这样的话,感觉第一种没有第二种方便啊,为什么要吧路径拆分开呢?

诸小亮:这是你的错觉,把路径拆分,父路径可以做为一个变量了

张小飞:工作中用第一种方式的多吗?

诸小亮:额。。。,好吧,这种方式并不常用,了解了解就行了

2.1.4. File(File parent, String child)

诸小亮:既然说到了这里,就说一个构造方法——File(File parent, String child)

File parent = new File("G:\\learn");//一个父文件,一个子路径File file = new File(parent, "123.txt");

结果:

2.1.5. File.separator:路径分隔符

诸小亮:下面我们说说—— File.separator

张小飞:这是啥东西

诸小亮:这是路径分隔符,不同操作系统下,文件路径是不一样的,比如:

winows:G:\learn\123.txtLinux:/home/123.txt

张小飞:原来还有这种说法

诸小亮:为了使路径分隔符统一,Java中定义了 File.separator 来表示路径分隔符

张小飞:您的意思是,在创建 File 对象时候要使用 File.separator 吗?

诸小亮:不错,最好如此,比如:

结果:

张小飞:明白了

2.2. 常用方法

诸小亮:下面介绍一些 File 类中常用的方法

2.2.1. 基本方法

public static void main(String[] args) throws IOException {    File file = new File("G:\\learn\\yase.txt");    System.out.println("文件名:    " + file.getName());    System.out.println("文件大小:   " + file.length());//单位:字节    System.out.println("文件绝对路径:   " + file.getAbsolutePath());    System.out.println("文件所在目录:   " + file.getParent());    System.out.println("是否是目录:   " + file.isDirectory());    //System.out.println("是否是文件:   " + file.isFile());    System.out.println("是否存在:   " + file.exists());}

结果:

2.2.2. createNewFile

createNewFile:指定的文件不存在时,可以用这个方法创建文件,比如:

File file = new File("G:\\learn\\daji.txt");//文件在硬盘上不存在boolean bool = file.createNewFile();//创建文件,返回true表示成功System.out.println(bool);

结果:

,硬盘上文件也就存在了

张小飞:那如果文件已经存在了呢?

诸小亮:。。。。,当然是返回 false 了

2.2.3. delete

delete:删除文件,true:删除成功,false:删除失败,比如:

结果:

张小飞:不对啊,我这里怎么删除失败了,您看看

诸小亮:我不看也知道,你删除的是一个文件夹吧

张小飞:您怎么知道?

诸小亮:因为删除文件夹,必须先清空文件夹中的内容,比如:

结果:

诸小亮:当文件夹中没有内容时,可以删除

再次执行:

张小飞:明白了

2.2.4. mkdir

张小飞:可以用 File 创建一个文件夹吗?

诸小亮:当然可以,使用 mkdir 命令就行了

mkdir:创建目录,如果 File 是个目录,可以使用这个方法,比如:

File file = new File("G:\\learn\\lvbu");boolean bool = file.mkdir();//创建目录System.out.println(bool);

结果:

,再去硬盘上查看,就可以看到 lvbu 这个目录了

张小飞:创建多级目录呢?

诸小亮:那就要使用 mkdirs 方法了

mkdirs:创建多级目录,比如:

结果:

张小飞:原来如此

2.2.5. isDirectory

张小飞:对了,刚发现,文件夹也是用 File 来表示

诸小亮:是的啊,怎么了

张小飞:这样的话,如果区分一个 File 对象是文件还是文件夹呢?

诸小亮:没关系,可以使用 isDirectory 方法,返回 true 就表示是个文件夹

张小飞:好的,我试试

诸小亮:不过需要注意

结果:

张小飞:注意什么呢?

诸小亮:上图中,硬盘上没有 diaochan 这个文件或文件夹,但是 isDirectory 返回 false

张小飞:噢噢,明白了

诸小亮:所以说,在调用 isDirectory 前,先要确认 File 是否已经存在

张小飞:好的,我记下了

2.2.6. renameTo

renameTo:重命名,比如:

结果:

2.2.7. list

list():返回 File 目录下所有的文件和文件夹名称,返回值:字符串数组,比如:

public static void main(String[] args){    File file = new File("G:\\learn");        //列出 G:\\learn 下所有的文件夹和文件    String[] list = file.list();    for(String name : list){        System.out.println(name);    }}

结果:

诸小亮:如果指定的 File 并不存在,返回 null,比如:

结果:

张小飞:如果一个文件夹中文件太多,我只想要其中某些文件呢?

诸小亮:可以指定过滤器,只返回指定格式的文件,比如:

public static void main(String[] args){    File file = new File("G:\\learn");    //使用 FilenameFilter(文件名过滤器) ,过滤出指定类型的文件    String[] list = file.list(new FilenameFilter() {        /**         * @param dir 就是上面的file对象         * @param name 是 G:\learn 目录下的文件或文件夹名称         * @return         */        @Override        public boolean accept(File dir, String name) {            return name.endsWith(".txt");//过滤出 G:\learn 下的 txt 文件        }    });    for(String name : list){        System.out.println(name);    }}

结果:

2.2.8. listFiles

listFiles:返回 File 下所有的文件和文件夹,并封装成 File 对象

public static void main(String[] args){    File file = new File("G:\\learn");    //列出 G:\learn 下所有的文件,并封装成 File 对象    File[] files = file.listFiles();    for(File f : files){        System.out.println(f.getAbsoluteFile());    }}

结果:

,如果指定的路径不存在,返回null

张小飞:这个也能用 FilenameFilter 吗?

诸小亮:可以的,同时也能用 FileFilter(文件过滤器),比如:

public static void main(String[] args){    File file = new File("G:\\learn");    //列出 G:\learn 下所有的文件,并封装成 File 对象    File[] files = file.listFiles(new FileFilter() {        /**         * @param pathname G:\learn 下的 File 对象         * @return         */        @Override        public boolean accept(File pathname) {            //过滤出 G:\learn 下的 txt 文件            return pathname.getAbsolutePath().endsWith(".txt");        }    });    for(File f : files){        System.out.println(f.getAbsoluteFile());    }}

结果:

3. 递归

张小飞:什么是递归?

诸小亮:递归——在方法中,自己调用自己

张小飞:还能自己调用自己?

诸小亮:当然可以了,比如——获取过一个目录下的所有文件和文件夹,包括子目录中的文件

public static void main(String[] args){    File file = new File("G:\\learn");    getFile(file);}private static void getFile(File file) {    if(file.exists() && file.isDirectory()){        for(File f : file.listFiles()){            System.out.println(f.getAbsoluteFile());            if(f.isDirectory()){                getFile(f);//自己内部调用自己            }        }    }}

结果:

张小飞:可否说说,使用 递归 的场景呢?

诸小亮:当方法需要被重复使用,且每次传递的参数不同时,可以考虑递归

张小飞:额。。。。,能不能再举个例子?

诸小亮:这简单,计算 6 的阶乘

分析:6!=6*5!,5!=5*4!。。。。,可以使用递归

public static void main(String[] args){    System.out.println(sum(6));// 输出:720}//计算 num 的阶乘private static int sum(int num) {    if(num==1){        return 1;    }    return num * sum(num-1);}

张小飞:明白了

标签: #filesjava