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

IO流编程:

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

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

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

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

File类的出现:

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

File类的构造函数:

94d2d5a4c70432f977223c800d922daa.png

越细分越灵活:

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

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

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

File类的获取:

2340a93a90ce87b2225fd74e1b9e1b91.png

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

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

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

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

e06ca642544119240fb0d648db1ea999.png

ListFile()方法:

0d140e674fa85e05a5d1d6cbc7292bb6.png

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

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

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

课堂代码:

packagecom.oracle.demo01;importjava.io.File;importjava.io.IOException;//file类包含://1:路径path//2:目录directory-->文件夹//3:文件file//Windows系统是;号,Linux系统是:号路径分隔符!//Windows系统是\号,Linux系统是/号名称分隔符!

public classDemo01 {public static voidmain(String[] args){

method10();

}public static voidmethod1() {//与系统有关的路径分隔符:

System.out.println(File.pathSeparator);//与系统有关的名称分隔符:

System.out.println(File.separator);

}public static voidmethod2(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 voidmethod3() {

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 voidmethod4() {//获取本路径目录名或者文件名:

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() throwsIOException {//创建文件(只能创建文件,不能创建文件夹):

File file1=new File("F:\\IOTest\\TestB.txt");boolean IsSucc=file1.createNewFile();

System.out.println(IsSucc);

}public static void method6() throwsIOException {//创建文件夹:

File file1=new File("F:\\IOTest\\TestDir");//mkdirs多级目录,mkdir单级目录!

boolean IsSucc=file1.mkdirs();

System.out.println(IsSucc);

}public static voidmethod7() {

File file1=new File("F:\\IOTest\\TestB.txt");//删除该文件夹(或文件),直接从硬盘删除,不走回收站,删除需谨慎:

boolean IsSucc=file1.delete();

System.out.println(IsSucc);

}public static voidmethod8() {

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 voidmethod9() {//获取该文件夹下所有文件或文件夹的字符串名称:

File file1=new File("F:\\IOTest");//存进String数组:

String[] files=file1.list();//增强for遍历:

for(String Str:files) {

File file=newFile(file1,Str);if(file.getName().equals("TestA.txt")) {boolean flag=file1.delete();

System.out.println(flag);

}

}

}public static voidmethod10() {//返回File[]的listFiles()方法:

File file1=new File("F:\\IOTest");

File[] files=file1.listFiles();//对象或者容器去调用方法,如果为NULL,会报空指针异常!

for(File Str:files) {

System.out.println(Str);

}

}

}

上午作业1:

packagecom.oracle.homework;importjava.io.File;public classHW1 {public static voidmain(String[] args) {//调用统计文件大小的方法:

getSize("F:\\GameDownload\\LOL_V4.1.0.1_FULL.exe");

}//统计文件大小的方法:

public static voidgetSize(String fileName) {

File file=newFile(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:

packagecom.oracle.homework;importjava.io.File;public classHW2 {public static voidmain(String[] args) {//调用方法:

deleteDir("F:\\IOTest");

}//定义删除文件夹的方法:

public static voiddeleteDir(String dirName) {

File file=newFile(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("该文件夹不存在,请重新输入!");

}

}

}

文件过滤器:

286b33bcd84a6314b8df86000868361c.png

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

f309aab04773d01b57caf175b7508d9e.png

ba032385e59e60fc71f716e1b82d858d.png

递归:

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

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

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

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

课堂示例代码1:

packagecom.oracle.demo01;importjava.io.File;//Windows不区分大小写!

public classDemo02 {public static voidmain(String[] args) {

File file=new File("F:\\IOTest");//listFilter调用MyFilter内的accept过滤器:

File[] files=file.listFiles(newMyFilter());for(File Str:files) {

System.out.println(Str);

}

}

}packagecom.oracle.demo01;importjava.io.File;importjava.io.FileFilter;//实现文件过滤器FileFliter:

public class MyFilter implementsFileFilter {public booleanaccept(File pathname) {//返回.java文件结尾的文件://String name=pathname.getName().toLowerCase();//boolean flag=name.endsWith(".java");//return flag;

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

}

}

递归的演示:

packagecom.oracle.demo01;importjava.io.File;//获取某目录下所有的文件:

public classDemo03 {public static voidmain(String[] args) {

File file=new File("F:\\IOTest");

getAllFiles(file);

}//递归:自己调用自己!

public static voidgetAllFiles(File file) {

File[] files=file.listFiles();for(File Str:files) {if(Str.isDirectory()) {

getAllFiles(Str);

}else{

System.out.println(Str);

}

}

}

}

递归求1-N的和:

packagecom.oracle.demo01;public classDemo04 {//递归:要运行的方法主体不变,而参与运行的方法参数会变!//递归必须要写一个程序的出口,否则该程序没有意义!

public static voidmain(String[] args) {//getNum(100);

System.out.println(getNum(100));

}//用递归计算1-100的和://一直调用,直到有值为止,再返回去!

public static int getNum(intnum) {if(num==1) {//return返回给调用者

return 1;

}return num+getNum(num-1);

}

}

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

packagecom.oracle.demo01;importjava.io.File;//挑选.java文件,包含子目录:

public classDemo05 {public static voidmain(String[] args) {

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

}public static voidgetAllFile(File file) {

File[] files=file.listFiles(newYourFilter());for(File Str:files) {if(Str.isDirectory()) {

getAllFile(Str);

}else{

System.out.println(Str);

}

}

}

}packagecom.oracle.demo01;importjava.io.File;importjava.io.FileFilter;public class YourFilter implementsFileFilter {public booleanaccept(File pathname) {//是文件夹直接return true!

if(pathname.isDirectory()) {return true;

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

}

}

下午作业1:

packagecom.oracle.homework;importjava.util.Scanner;//用户输入数字N,求出N的阶乘!

public classHW3 {public static voidmain(String[] args) {

System.out.println("请输入一个数字:");

@SuppressWarnings("resource")

Scanner Scan=newScanner(System.in);int Num=Scan.nextInt();

System.out.println(Num+"的阶乘为:"+getNFactorial(Num));

}public static int getNFactorial(intNum) {if(Num==1) {return 1;

}return Num*getNFactorial(Num-1);

}

}

下午作业2:

packagecom.oracle.homework;importjava.io.File;//搜索指定目录中的.java文件(含子目录):

public classHW4 {public static voidmain(String[] args) {//调用getAllJava方法:

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

}public static voidgetAllJava(File file) {

File[] files=file.listFiles(newOurFilter());for(File Str:files) {if(Str.isDirectory()) {

getAllJava(Str);

}else{

System.out.println(Str);

}

}

}

}packagecom.oracle.homework;importjava.io.File;importjava.io.FileFilter;//实现FileFilter接口并重写accept方法:

public class OurFilter implementsFileFilter {public booleanaccept(File pathname) {if(pathname.isDirectory()) {return true;

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

}

}

packagecom.oracle.homework;

importjava.io.File;

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

publicclass

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");

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值