(89)File类:创建、删除、判断、获取文件列表、文件递归

一、创建文件对象和跨平台的separator

        //创建File对象

        //将a.txt封装成file对象,可以将已有的和未出现的文件或者文件夹城装成对象
        File f1=new File("a.txt");

        File f2=new File("E:\\abc","b.txt");

        File d=new File("E:\\abc");
        File f3=new File(d,"c.txt");
        //若写的相对路径,则打印f1为相对路径,若写的绝对路径,则打印f2为绝对路径
        System.out.println("f1:"+f1);//f1:a.txt
        System.out.println("f2:"+f2);//f2:E:\abc\b.txt
        System.out.println("f3:"+f3);   

        //但是路径中写\\只是在win系统这样,不利于跨平台性,所以File类提供了字段separator
        File f4=new File("E:"+File.separator+"abc","c.txt");
        System.out.println("f4:"+f4);//f4:E:\abc\c.txt

二、基本操作
1.创建:
①boolean createNewFile():在指定位置创建文件,如果该文件已经存在。则不创建,返回false.和输出流不一样,输出流对象已建立即创建文件,而且文件已经存在的话,被覆盖。
②public boolean mkdir():创建目录(只能创建一级目录)
public boolean mkdirs():创建多级目录
2.删除:
boolean delete():删除此抽象路径名表示的文件或者目录
void deleteOnExit():在虚拟机终止时,请求删除抽象路径名表示的文件或者目录
3.判断:
boolean exists():文件或者目录是否存在
boolean isFile():判断是否为一个文件
boolean isDirectory:判断是否为一个目录
boolean isAbsolute:判断此路径是否为绝对路径(只是判断是否为绝对路径,与是否存在文件或者目录无关,即没有创建文件或者目录,只要表示的是绝对路径,那么其就为真)

        //创建文件,并对其简单操作
        File f=new File("file.txt");
        sop("create:"+f.createNewFile());
        sop("exists:"+f.exists());//判断文件是否存在
        sop("execute:"+f.canExecute());//判断文件是否可执行

        //创建文件夹
        //File f1=new File("file");
        //sop("mkdir:"+f1.mkdir());

        //创建子文件夹在原有的file文件夹中创建子文件夹abc
        //File f2=new File("file\\abc");
        //sop("mkdir1:"+f2.mkdir());

        //创建多级目录,是前面创建文件夹和子文件夹的综合
        File f3=new File("file\\a\\b\\c");
        sop("mkdirs:"+f3.mkdirs()); 

        //
        File f=new File("file.txt");
       //f.mkdir();不能主观根据后缀名判断是文件还是目录,在目录名中也可以带有后缀名的目录名
       //记住:在判断文件对象是否为文件或者文件目录时,必须要先判断该文件对象封装的内容是否存在
       //通过exists判断

    sop("dir:"+f.isDirectory());//true
    sop("file:"+f.isFile());//false

     //File f=new File("C:\\file.txt");
    sop("isAbsolute:"+f.isAbsolute());

4,获取信息:
①getName():获取目录或者文件名称
②getPath():返回自定义的相对路径或者绝对路径,若只写个文件名,则返回相对路径;若写的是个 (”E:\file”,”b.txt”)则返回绝对路径
③ getAbsolutePath():无论创建的相对路径文件对象,还是绝对文件对象,返回的都是绝对路径
④ getParent():该方法返回绝对路径中的父目录,若没指定父目录,则返回null;若相对路径中含有上一 层目录,则返回结果为父级目录
⑤ long lastModified():
⑥long length():获取文件的长度
⑦boolean renameTo(File dest):类似剪切也改名

File f1=new File("E:\\ABC.txt");
    File f2=new File("d:\\abc.txt");
    sop(f1.renameTo(f2));

5,获取文件列表
①public static File[] listRoots():获取所有的根目录(注意其为静态方法)
②public String[] list():获取指定路径名表示的目录中的文件和目录


    //获取所有的根目录
    File[] files=File.listRoots();
    for(File f:files) {
        sop(f);
    }

    //获取指定路径下的文件和目录
    File f=new File("D:\\BaiduNetdiskDownload\\【he11oworld.com】毕向东25天");
    String[] names=f.list();
    for(String name:names) {
        sop(name);
    }

③public String[] list(FilenameFilter filter):获取指定目录下的指定文件

File f=new File("D:\\BaiduNetdiskDownload\\【he11oworld.com】毕向东25天\\源代码\\day18");
    String[] names=f.list(new FilenameFilter()//匿名内部类
    {
    //accept方法,确定要返回的文件名或者目录名
        public boolean accept(File dir,String name) {
            return name.endsWith(".bmp");
        }

    });
    for(String name:names) {
        sop(name);
    }

④public File[] listFiles():返回当前目录下的所有文件或者目录
在实际的开发中,只获取文件名操作较少,一般是要获取到文件,并对文件进行操作,这样才有意义。

     获得当前目录下的所有文件
    File dir=new File("c:\\");
    File[] files=dir.listFiles();

    for(File f:files) {
        sop(f.getName()+"------"+f.length());//这个长度只能获取文件长度,不能获取目录长度
    }

递归
一、新的需求:列出指定目录下的文件或者文件夹,包含子目录的的内容,也就是列出指定目录下的所有内容。
分析:因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,就再次调用本功能,也就是函数自身调用自身,这种表现形式或者编程手法称为递归。
递归要注意的是:
1)限定条件
2)递归次数,避免内存溢出

public static void showDir(File dir) {
    System.out.println(dir);
    File[] files=dir.listFiles();
    for(int x=0; x<files.length;x++) {
        if(files[x].isDirectory())
            showDir(files[x]);
        else
            System.out.println(files[x]);
    }
}
主函数调用:File f=new File("D:\\BaiduNetdiskDownload\\【he11oworld.com】毕向东25天");
    showDir(f);

图示演示↓
这里写图片描述

二、上面的遍历变形:删除当前某个目录
思路:从内往外删
若一层的目录或者文件都删完,应该在for后面在把此层的文件夹删掉。

public static void removeDir(File dir) {

    File[] files=dir.listFiles();
    for(int x=0; x<files.length;x++) {
        if(files[x].isDirectory())
            removeDir(files[x]);
        else
            System.out.println(files[x].delete());
    }

    System.out.println(dir+":::"+dir.delete());


}

三、将一个指定目录下的java文件的绝对路径,存储到一个文本文件中,建立一个java文件列表文件
思路:
1;对指定的目录进行递归。
2;获取在递归过程中的所有Java文件路径
3;将这些路径存储到集合中
4;将集合中的数据写入文件中

import java.io.*;
import java.util.*;

public class Demo2 {

    private ArrayList<String>  al;
    Demo2(ArrayList  al){
        this.al=al;
    }
    public   void search(File dir) {

        File[] files=dir.listFiles();
        for(int x=0; x<files.length;x++) {
            if(files[x].isDirectory()) 
                search(files[x]);
            else {
                String name=files[x].getName();
                if(name.endsWith(".Java")) {
                    String path=files[x].getAbsolutePath();

                    al.add(path);
                }
            }
        }   
    }

    public static void main(String[] args)throws IOException {

        Demo2  d=new Demo2(new ArrayList<String>());
        File  f=new File("E:\\练习");
        d.search(f);
        FileWriter fw=new FileWriter("E:\\a.txt");
        BufferedWriter bufw=new BufferedWriter(fw);
        Iterator<String> it=d.al.iterator();
        while(it.hasNext())
        {

            bufw.write(it.next());
            bufw.flush();
            bufw.newLine();
        }
        bufw.close;
    }
}

需求1在之前的十进制转换为二进制过程中,也可以用递归:

public static void toBin(int num) {
    if(num>0) {
        toBin(num/2);
        sop(num%2);
    }
}
调用:toBin(6)//输出110

图示表示如下:↓
这里写图片描述

求1-num的总和(带返回值的递归):

public static int   getSum(int n)
{
if(n==1)
      return 1;
 return n+getSum(n-1);
}

图示演示执行过程:↓
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值