2018-08-20内容IO流中的File类+文件过滤器FileFilter+递归

IO流编程:

要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘或者U盘等)上!

当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作!

当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作!

因此我们把这种输入和输出动作称为IO操作!

File类的出现:

File文件和目录路径名的抽象表示形式!即Java中把文件或者目录(文件夹)都封装成File对象!也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可!

File类的构造函数:

越细分越灵活:

   传一个父对象,后面传路径!

   传入对象的路径(绝对路径针对于全电脑的,相对路径相对于工程内部)!

   传入父级路径,后面传入子路径!

 

File类的获取:

①   getPath()拿到路径(即toString方法)!

②   返回文件或者文件夹的字节数大小!

③   getName()拿到文件名或者文件夹名!

文件或者文件夹的创建或删除:

ListFile()方法:

注意:在获取指定目录下的文件或者文件夹时必须满足下面两个条件

1;指定的目录必须是存在的!

2;指定的必须是目录。否则容易引发返回数组为NULL,出现NullPointerException!

课堂代码:

package com.oracle.demo01;
import java.io.File;
import java.io.IOException;
//file类包含:
//1:路径path
//2:目录directory-->文件夹
//3:文件file
//Windows系统是;号,Linux系统是:号路径分隔符!
//Windows系统是号,Linux系统是/号名称分隔符!
public class Demo01 {
    public static void main(String[] args){
        method10();
    }
    public static void method1() {
        //与系统有关的路径分隔符:
        System.out.println(File.pathSeparator);
        //与系统有关的名称分隔符:
        System.out.println(File.separator);
    }
    
    public static void method2(String Child) {
        //两个\是转义符!
        //实际的路径转化成一个抽象的对象!
        //File类构造方法不会检验该文件或该文件夹是否真实存在!
        //绝对路径!
        File file1=new File("F:\IOTest\TestA.txt");
        //传参:
        File file2=new File("F:",Child);
        File file3=new File(new File("F:\IOTest"),Child);
        System.out.println(file2);
    }
    public static void method3() {
        File file1=new File("F:\IOTest\TestA.txt");
        //拿到File对象的绝对路径:
        System.out.println(file1.getAbsolutePath());
        //相对路径拿到的是本工程的路径:
        File file2=new File("src");
        System.out.println(file2.getAbsolutePath());
    }
    public static void method4() {
        //获取本路径目录名或者文件名:
        File file1=new File("F:\IOTest\TestA.txt");
        System.out.println(file1.getName());
        //getPath和toString方法一个作用:
        System.out.println(file1.getPath());
        //返回文件(针对于文件)的长度Long类型(字节数)
        System.out.println(file1.length());
        //找个大一点的文件来看Length:
        File file2=new File("D:\Program Files\360DrvMgr\feedback\360ScreenCapture.exe");
        System.out.println(file2.length());
    }
    public static void method5() throws IOException {
        //创建文件(只能创建文件,不能创建文件夹):
        File file1=new File("F:\IOTest\TestB.txt");
        boolean IsSucc=file1.createNewFile();
        System.out.println(IsSucc);
    }
    public static void method6() throws IOException {
        //创建文件夹:
        File file1=new File("F:\IOTest\TestDir");
        //mkdirs多级目录,mkdir单级目录!
        boolean IsSucc=file1.mkdirs();
        System.out.println(IsSucc);
    }
    public static void method7() {
        File file1=new File("F:\IOTest\TestB.txt");
        //删除该文件夹(或文件),直接从硬盘删除,不走回收站,删除需谨慎:
        boolean IsSucc=file1.delete();
        System.out.println(IsSucc);
    }
    public static void method8() {
        File file1=new File("F:\IOTest\TestB.txt");
        //先判断file对象表示文件或文件夹是否真实存在:
        boolean flagex=file1.exists();
        //判断file对象是否是一个目录:
        boolean flagdi=file1.isDirectory();
        //判断file对象是否是一个文件:
        boolean flagfi=file1.isFile();
    }
    public static void method9() {
        //获取该文件夹下所有文件或文件夹的字符串名称:
        File file1=new File("F:\IOTest");
        //存进String数组:
        String[] files=file1.list();
        //增强for遍历:
        for(String Str:files) {
            File file=new File(file1,Str);
            if(file.getName().equals("TestA.txt")) {
                boolean flag=file1.delete();
                System.out.println(flag);
            }
        }
    }
    public static void method10() {
        //返回File[]的listFiles()方法:
        File file1=new File("F:\IOTest");
        File[] files=file1.listFiles();
        //对象或者容器去调用方法,如果为NULL,会报空指针异常!
        for(File Str:files) {
            System.out.println(Str);
        }
    }
}

上午作业1:

package com.oracle.homework;
import java.io.File;
public class HW1 {
    public static void main(String[] args) {
        //调用统计文件大小的方法:
        getSize("F:\GameDownload\LOL_V4.1.0.1_FULL.exe");
    }
    //统计文件大小的方法:
    public static void getSize(String fileName) {
        File file=new File(fileName);
        boolean flag=file.exists();
        if(flag) {
            boolean IsFi=file.isFile();
            if(IsFi) {
                System.out.println(file.length());
            }else {
                System.out.println("这不是一个文件,请重新输入!");
            }
        }else {
            System.out.println("该文件不存在,请重新输入!");
        }
    }
}

上午作业2:

package com.oracle.homework;
import java.io.File;
public class HW2 {
    public static void main(String[] args) {
        //调用方法:
        deleteDir("F:\IOTest");
    }
    //定义删除文件夹的方法:
    public static void deleteDir(String dirName) {
        File file=new File(dirName);
        boolean flag=file.exists();
        if(flag) {
            boolean IsDir=file.isDirectory();
            if(IsDir) {
                //将内部文件都存进File数组:
                File[] fileArr=file.listFiles();
                if(fileArr!=null) {
                    //遍历把该文件夹下内容都删掉:
                    for(File Str:fileArr) {
                        Str.delete();
                        System.out.println("该文件夹内部文件:"+Str+"删除成功!");
                    }
                    boolean IsSucc=file.delete();
                    String Mess=(IsSucc?"删除文件夹成功!":"删除文件夹失败!");
                    System.out.println(Mess);
                }else {
                    boolean IsSucc=file.delete();
                    String Mess=(IsSucc?"删除文件夹成功!":"删除文件夹失败!");
                    System.out.println(Mess);
                }
                System.out.println();
            }else {
                System.out.println("这不是一个文件夹,请重新输入!");
            }
        }else {
            System.out.println("该文件夹不存在,请重新输入!");
        }
    }
}

文件过滤器:

//该方法有点过时了:可以使用listFiles(FileFilter filter)返回一个File[]数组,然后通过实现FileFilter接口的类重写accept方法,来进行筛选!

递归:

递归分为两种,直接递归和间接递归:

①   直接递归称为方法自身调用自己!

②   间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法!

注意:递归一定要有条件限定,保证递归能够停止下来(留有程序的出口),否则会发生栈内存溢出,在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出!

课堂示例代码1:

package com.oracle.demo01;
import java.io.File;
//Windows不区分大小写!
public class Demo02 {
    public static void main(String[] args) {
        File file=new File("F:\IOTest");
        //listFilter调用MyFilter内的accept过滤器:
        File[] files=file.listFiles(new MyFilter());
        for(File Str:files) {
            System.out.println(Str);
        }
    }
}

package com.oracle.demo01;
import java.io.File;
import java.io.FileFilter;
//实现文件过滤器FileFliter:
public class MyFilter implements FileFilter {
    public boolean accept(File pathname) {
        //返回.java文件结尾的文件:
        //String name=pathname.getName().toLowerCase();
        //boolean flag=name.endsWith(".java");
        //return flag;
        return pathname.getName().toLowerCase().endsWith(".java");
    }
}

递归的演示:

package com.oracle.demo01;
import java.io.File;
//获取某目录下所有的文件:
public class Demo03 {
    public static void main(String[] args) {
        File file=new File("F:\IOTest");
        getAllFiles(file);
    }
    //递归:自己调用自己!
    public static void getAllFiles(File file) {
        File[] files=file.listFiles();
        for(File Str:files) {
            if(Str.isDirectory()) {
                getAllFiles(Str);
            }else {
                System.out.println(Str);
            }
        }
    }
}

递归求1-N的和:

package com.oracle.demo01;
public class Demo04 {
    //递归:要运行的方法主体不变,而参与运行的方法参数会变!
    //递归必须要写一个程序的出口,否则该程序没有意义!
    public static void main(String[] args) {
        //getNum(100);
        System.out.println(getNum(100));
    }
    //用递归计算1-100的和:
    //一直调用,直到有值为止,再返回去!
    public static int getNum(int num) {
        if(num==1) {
            //return返回给调用者
            return 1;
        }
        return num+getNum(num-1);
    }
}

递归寻找文件夹中.java结尾的文件(含子目录):

package com.oracle.demo01;
import java.io.File;
//挑选.java文件,包含子目录:
public class Demo05 {
    public static void main(String[] args) {
        getAllFile(new File("F:\IOTest"));
    }
    public static void getAllFile(File file) {
        File[] files=file.listFiles(new YourFilter());
        for(File Str:files) {
            if(Str.isDirectory()) {
                getAllFile(Str);
            }else {
                System.out.println(Str);
            }
        }
    }
}

package com.oracle.demo01;
import java.io.File;
import java.io.FileFilter;
public class YourFilter implements FileFilter {
    public boolean accept(File pathname) {
        //是文件夹直接return true!
        if(pathname.isDirectory()) {
            return true;
        }
        return pathname.getName().toLowerCase().endsWith(".java");
    }
}

下午作业1:

package com.oracle.homework;
import java.util.Scanner;
//用户输入数字N,求出N的阶乘!
public class HW3 {
    public static void main(String[] args) {
        System.out.println("请输入一个数字:");
        @SuppressWarnings("resource")
        Scanner Scan=new Scanner(System.in);
        int Num=Scan.nextInt();
        System.out.println(Num+"的阶乘为:"+getNFactorial(Num));
    }
    public static int getNFactorial(int Num) {
        if(Num==1) {
            return 1;
        }
        return Num*getNFactorial(Num-1);
    }
}

下午作业2:

package com.oracle.homework;
import java.io.File;
//搜索指定目录中的.java文件(含子目录):
public class HW4 {
    public static void main(String[] args) {
        //调用getAllJava方法:
        getAllJava(new File("F:\IOTest"));
    }
    public static void getAllJava(File file) {
        File[] files=file.listFiles(new OurFilter());
        for(File Str:files) {
            if(Str.isDirectory()) {
                getAllJava(Str);
            }else {
                System.out.println(Str);
            }
        }
    }
}

package com.oracle.homework;
import java.io.File;
import java.io.FileFilter;
//实现FileFilter接口并重写accept方法:
public class OurFilter implements FileFilter {
    public boolean accept(File pathname) {
        if(pathname.isDirectory()) {
            return true;
        }
        return pathname.getName().toLowerCase().endsWith(".java");
    }
}

package com.oracle.homework;

import java.io.File;

//搜索指定目录中的.java文件(含子目录)

public class HW4 {

     public static void main(String[] args) {

         //调用getAllJava方法:

         getAllJava(new File("F:\IOTest"));

     }

     public static void getAllJava(File file) {

         File[] files=file.listFiles(new OurFilter());

         for(File Str:files) {

              if(Str.isDirectory()) {

                   getAllJava(Str);

              }else {

                   System.out.println(Str);

              }

         }

     }

}

 

package com.oracle.homework;

import java.io.File;

import java.io.FileFilter;

//实现FileFilter接口并重写accept方法:

public class OurFilter implements FileFilter {

     public boolean accept(File pathname) {

         if(pathname.isDirectory()) {

              return true;

         }

         return pathname.getName().toLowerCase().endsWith(".java");

     }

}

原文地址:https://www.cnblogs.com/postgredingdangniu/p/9505983.html