Java_IO流(二十二)——File类(构造函数、文件\文件夹的创建删除获取、文件过滤器)、递归

目录

第一章 File类

1.1 IO概述

1.2 File类的出现

1.3 File类的构造函数

1.4 文件和文件夹的创建删除等 

 1.5 File类的获取

1.6 listFiles()方法介绍

 1.7 文件过滤器

第二章 递归

2.1 概念

2.2 递归打印所有子目录中的文件路径

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

第三章 总结


第一章 File类

 

1.1 IO概述

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

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

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

 

1.2 File类的出现

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

import java.io.File;

/*
 *  java.io.File
 *    将操作系统中的,文件,目录(文件夹),路径,封装成File对象
 *    提供方法,操作系统中的内容
 *    File与系统无关的类
 *    文件 file
 *    目录 directory
 *    路径 path
 */
public class FileDemo {
	public static void main(String[] args) {
		//File类静态成员变量
		//与系统有关的路径分隔符
		String separator = File.pathSeparator;
		System.out.println(separator);// 是一个分号,目录的分割   Linux :
		
		//与系统有关的默认名称分隔符
		separator = File.separator;
		System.out.println(separator);// 向右 \  目录名称分割  Linux / 
	}
}

静态成员,使用类名直接调用(File.pathSeparator)

 

1.3 File类的构造函数

File类有4个构造函数,但是只需要掌握以下三个:

 1. File(String pathname)

传递路径名: 可以写到文件夹,可以写到一个文件 (c:\\abc   c:\\abc\\Demo.java)

功能:将路径封装File类型对象

/*
	 *  File(String pathname)
	 *  传递路径名: 可以写到文件夹,可以写到一个文件
	 *  c:\\abc   c:\\abc\\Demo.java
	 *  将路径封装File类型对象
	 */
	public static void function(){
		File file = new File("d:\\eclipse");
		System.out.println(file); 	//d:\eclipse
	}
}

2. File(String parent,String child)

传递路径,传递字符串父路径,字符串子路径

 好处: 单独操作父路径和子路径 ,以后可以使用函数传入参数来执行。

/*
	 *  File(String parent,String child)
	 *  传递路径,传递字符串父路径,字符串子路径
	 *  好处: 单独操作父路径和子路径
	 */
	public static void function_1(){
		File file = new File("d:","eclipse");
		System.out.println(file);//d:\eclipse
	}

3. File(File parent,String child)

传递路径,传递File类型父路径,字符串子路径

 好处: 父路径是File类型,父路径可以直接调用File类方法

/*
	 *  File(File parent,String child)
	 *  传递路径,传递File类型父路径,字符串子路径
	 *  好处: 父路径是File类型,父路径可以直接调用File类方法
	 */
	public static void function_2(){
		File parent = new File("d:");
		File file = new File(parent,"eclipse");
		System.out.println(file);//d:\eclipse
	}

注意:Window下的目录,文件名不区分大小写。

Linux区分大小写。

Window下写一个反斜线,Java中写两个反斜线(因为Java中有转义)

代码总和:
 

package day22.demo1;

import java.io.File;

/*
 *  File类的构造方法
 *  三种重载形式
 */
public class FileDemo1 {
	public static void main(String[] args) {
		function_2();
	}
	/*
	 *  File(File parent,String child)
	 *  传递路径,传递File类型父路径,字符串子路径
	 *  好处: 父路径是File类型,父路径可以直接调用File类方法
	 */
	public static void function_2(){
		File parent = new File("d:");
		File file = new File(parent,"eclipse");
		System.out.println(file);//d:\eclipse
	}
	
	/*
	 *  File(String parent,String child)
	 *  传递路径,传递字符串父路径,字符串子路径
	 *  好处: 单独操作父路径和子路径
	 */
	public static void function_1(){
		File file = new File("d:","eclipse");
		System.out.println(file);//d:\eclipse
	}
	
	/*
	 *  File(String pathname)
	 *  传递路径名: 可以写到文件夹,可以写到一个文件
	 *  c:\\abc   c:\\abc\\Demo.java
	 *  将路径封装File类型对象
	 */
	public static void function(){
		File file = new File("d:\\eclipse");
		System.out.println(file); 	//d:\eclipse
	}
}

 

1.4 文件和文件夹的创建删除等 

package day22.demo1;

import java.io.File;
import java.io.IOException;

/*
 *  File类的创建和删除功能
 *  文件或者是目录
 */
public class FileDemo2 {
	public static void main(String[] args)throws IOException {
		function();
	}
	/*
	 *  File类的删除功能
	 *  boolean delete()
	 *  删除的文件或者是文件夹,在File构造方法中给出
	 *  删除成功返回true,删除失败返回false
	 *  删除方法,不走回收站,直接从硬盘中删除
	 *  删除有风险,运行需谨慎
	 */
	public static void function_2(){
		File file = new File("d:\\a.txt");
		boolean b = file.delete();
		System.out.println(b);
	}
	
	/*
	 *  File创建文件夹功能
	 *  mkdir()只能创建单层文件夹,不推荐使用
	 *  boolean mkdirs() 创建多层文件夹
	 *  创建的路径也在File构造方法中给出
	 *  文件夹已经存在了,不在创建
	 */
	public static void function_1(){
		//File file = new File("d:\\abc");
		File file = new File("d:\\abc\\b");
		boolean b = file.mkdirs();//多层,单层均可创建
		System.out.println(b);
	}
	
	
	/*
	 *  File创建文件的功能
	 *  boolean createNewFile()
	 *  创建的文件路径和文件名,在File构造方法中给出
	 *  文件已经存在了,不在创建
	 */
	public static void function()throws IOException{
		//File file = new File("d:\\a.txt");
		File file = new File("d:\\a");		//创建文件,无后缀默认为记事本文件
		boolean b = file.createNewFile();
		System.out.println(b);
	}
}
package day22.demo1;

import java.io.File;

/*
 *  File类的判断功能
 */
public class FileDemo4 {
	public static void main(String[] args) {
		function_1();
	}
	/*
	 *  File判断功能
	 *  boolean isDirectory()
	 *  判断File构造方法中封装的路径是不是文件夹
	 *  如果是文件夹,返回true,不是文件返回false
	 *  
	 *  boolean isFile()
	 *  判断File构造方法中封装的路径是不是文件
	 */
	public static void function_1(){
		File file = new File("D:\\java");
		if(file.exists()){
			boolean b = file.isDirectory();
			System.out.println(b);
		}
	}
	
	/*
	 *  File判断功能
	 *  boolean exists()
	 *  判断File构造方法中封装路径是否存在
	 *  存在返回true,不存在返回false
	 */
	public static void function(){
		File file = new File("src");
		boolean b = file.exists();
		System.out.println(b);
	}
}

 

 1.5 File类的获取

创建完了File对象之后,那么File类中都有如下常用方法,可以获取文件相关信息

1.String getName()

返回路径中表示的文件或者文件夹名,即获取路径中的最后部分的名字

不管文件或者文件夹是否存在,只负责返回后面一部分的字符串 

/*
	 *  File类的获取功能
	 *  String getName()
	 *  返回路径中表示的文件或者文件夹名,即获取路径中的最后部分的名字
	 *  不管文件或者文件夹是否存在,只负责返回后面一部分的字符串
	 */
	public static void function(){
		File file = new File("d:\\eclipse\\eclipse.exe");
		String name = file.getName();
		System.out.println(name);
		
		//getPath()功能:File类型转换为String类型
		/*String path = file.getPath();
		System.out.println(path);*/
//		System.out.println(file);
	}

2.long length()

返回路径中表示的文件的字节数。

不能获取文件夹的字节数,只能获取文件的字节数。

/*
	 * File类获取功能
	 * long length()
	 * 返回路径中表示的文件的字节数
	 * 不能获取文件夹的字节数,只能获取文件的
	 */
	public static void function_1(){
		File file = new File("d:\\eclipse\\eclipse.exe");
		long length = file.length();
		System.out.println(length);
	}

 3.获取绝对路径

 一般获取返回值都为两套,一套返回值值为String,一套为File,一般用于文件操作,建议使用File。

String getAbsolutePath() ,返回String对象

File   getAbsoluteFile() ,返回File对象

获取绝对路径,eclipse环境中,写的是一个相对路径,绝对位置工程根目录

/*
	 * File类获取功能
	 * String getAbsolutePath() 返回String对象
	 * File   getAbsoluteFile() 返回File对象
	 * 获取绝对路径
	 * eclipse环境中,写的是一个相对路径,绝对位置工程根目录
	 */
	public static void function_2(){
		//File file = new File("src");
		File file = new File("abc");//文件不存在,返回的也是D:\Users\Administrator\eclipse-workspace\practice\abc
		File absolute = file.getAbsoluteFile();
		System.out.println(absolute);//D:\Users\Administrator\eclipse-workspace\practice\src

	}

 

4. 获取父路径

String getParent() 返回String对象

File getParentFile()返回File对象
 

/*
	 * File类的获取功能
	 * String getParent() 返回String对象
	 * File getParentFile()返回File对象
	 * 获取父路径
	 * 
	 */
	public static void function_3(){
		File file = new File("d:\\eclipse\\eclipse.exe");
		//File parent = file.getParentFile().getParentFile();//d:\
		File parent = file.getParentFile().getParentFile().getParentFile(); //null
		System.out.println(parent);
	}

代码总和: 

package day22.demo1;

import java.io.File;

/*
 *  File类的获取功能
 */
public class FileDemo3 {
	public static void main(String[] args) {
		function_2();
	}
	/*
	 * File类的获取功能
	 * String getParent() 返回String对象
	 * File getParentFile()返回File对象
	 * 获取父路径
	 * 
	 */
	public static void function_3(){
		File file = new File("d:\\eclipse\\eclipse.exe");
		//File parent = file.getParentFile().getParentFile();//d:\
		File parent = file.getParentFile().getParentFile().getParentFile(); //null
		System.out.println(parent);
	}
	
	/*
	 * File类获取功能
	 * String getAbsolutePath() 返回String对象
	 * File   getAbsoluteFile() 返回File对象
	 * 获取绝对路径
	 * eclipse环境中,写的是一个相对路径,绝对位置工程根目录
	 */
	public static void function_2(){
		//File file = new File("src");
		File file = new File("abc");//文件不存在,返回的也是D:\Users\Administrator\eclipse-workspace\practice\abc
		File absolute = file.getAbsoluteFile();
		System.out.println(absolute);//D:\Users\Administrator\eclipse-workspace\practice\src

	}
	
	/*
	 * File类获取功能
	 * long length()
	 * 返回路径中表示的文件的字节数
	 * 不能获取文件夹的字节数,只能获取文件的
	 */
	public static void function_1(){
		File file = new File("d:\\eclipse\\eclipse.exe");
		long length = file.length();
		System.out.println(length);
	}
	
	/*
	 *  File类的获取功能
	 *  String getName()
	 *  返回路径中表示的文件或者文件夹名,即获取路径中的最后部分的名字
	 *  不管文件或者文件夹是否存在,只负责返回后面一部分的字符串
	 */
	public static void function(){
		File file = new File("d:\\eclipse\\eclipse.exe");
		String name = file.getName();
		System.out.println(name);
		
		//getPath()功能:File类型转换为String类型
		/*String path = file.getPath();
		System.out.println(path);*/
//		System.out.println(file);
	}
}

 

1.6 listFiles()方法介绍

获取一个目录中的所有文件或者目录中的文件夹,推荐使用listFiles()方法,返回的是绝对路径。

1.String[] list()

获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)

 返回只有名字

/*
	 *  File类的获取功能
	 *  String[] list()
	 *  获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
	 *  返回只有名字
	 */
	public static void function(){
		File file = new File("c:");
		String[] strArr = file.list();
		System.out.println(strArr.length);//21
		for(String str : strArr){
			System.out.println(str);//$360Section  $RECYCLE.BIN 360SANDBOX...
		}
	}

 2. File[] listFiles()

 获取到File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)

返回的是目录或者文件的全路径

/*
	 *  File类的获取功能
	 *  File[] listFiles()
	 *  获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
	 *  返回的是目录或者文件的全路径
	 */
	public static void function_1(){
		File file = new File("D:\\java");
		File[] fileArr = file.listFiles();
		for(File f : fileArr){
			System.out.println(f);//D:\java\bin...
		}
	}

3. File.listRoots()

获取系统中的所有根目录

public static void function_2(){
		//获取系统中的所有根目录
		File[] fileArr = File.listRoots();
		for(File f : fileArr){
			System.out.print(f+"  ");	//C:\  D:\  E:\  F:\  
		}
		System.out.println();
	}

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

1. 指定的目录必须是存在的,

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

 

 1.7 文件过滤器

如果我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹如何操作呢?

File类中重载的listFiles方法,并且接受指定的过滤器。

listFiles()遍历目录的同时,获取到了文件名的全路径,调用自定义过滤器中重写的抽象方法accept(pathname),如果accept()返回值为true时,才将此pathname加入Files数组中。

当我们需要过滤文件名称时就可以使用FilenameFilter这个过滤器,当我们想对当前文件或文件夹进行过滤,就可以使用FileFilter ,比如需要当前目录下的所有文件夹,就可以使用FileFilter 过滤器。

 自定义过滤器:

package day22.demo1;

import java.io.File;
import java.io.FileFilter;

/*
 *  自定义过滤器
 *  实现FileFilter接口,重写抽象方法
 */
public class MyFilter implements FileFilter{
	public boolean accept(File pathname)  {
		System.out.println(pathname+"#######");
		/*
		 * pathname 接受到的也是文件的全路径
		 * d:\\demo\\a.txt
		 * 对路径进行判断,如果是java文件,返回true,不是java文件,返回false
		 * 文件的后缀结尾是.java
		 */
		String name = pathname.getName();
		return name.endsWith(".java");//以.java结尾的文件
		
	}
}

测试类: 

package day22.demo1;

import java.io.File;

/*
 *  File类的获取,文件获取过滤器
 *  遍历目录的时候,可以根据需要,只获取满足条件的文件
 *  遍历目录方法 listFiles()重载形式
 *  listFiles(FileFilter filter)接口类型
 *  传递FileFilter接口的实现类
 *  自定义FileFilter接口实现类,重写抽象方法accept,
 *  接口实现类对象传递到遍历方法listFiles
 */
public class FileDemo6 {
	public static void main(String[] args) {
		File file = new File("d:\\demo");
		//MyFilter()返回值为true时,才将此文件存入数组中
		File[] fileArr = file.listFiles(new MyFilter());
		for(File f : fileArr){
			System.out.println(f);
		}
	}
}

运行结果:

 

第二章 递归

2.1 概念

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

直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。

注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。

在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。

/*
 *  方法的递归调用
 *    方法自己调用自己
 *  适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化
 *  注意:
 *     递归一定要有出口, 必须可以让程序停下
 *     递归次数不能过多
 *     构造方法,禁止递归
 */
public class DiGuiDemo {
	public static void main(String[] args) {
		/*int sum = getSum(3);
		System.out.println(sum);*/
		System.out.println(getJieCheng(5));
		System.out.println(getFBNQ(12));
	}
	/*
	 *  方法递归,计算斐波那契数列
	 *  
	 */
	public static int getFBNQ(int month){
		if( month == 1)
			return 1;
		if( month == 2)
			return 1;
		return getFBNQ(month-1)+getFBNQ(month-2);
	}
	
	/* 
	 *  计算阶乘 5!
	 *   5*4*3*2*1
	 */
	public static int getJieCheng(int n){
		if ( n == 1)
			return 1;
		return n * getJieCheng(n-1);
	}
			
	/*
	 *  计算 1+2+3+100和 = 5050
	 *  计算规律:
	 *    n+(n-1)+(n-2)
	 *    100+(100-1)+(99-1)+...1
	 */
	public static int getSum(int n){
		if( n == 1)
			return 1;
		return n + getSum(n-1);
	}
	
}

 

2.2 递归打印所有子目录中的文件路径

编写一个方法用来打印指定目录中的文件路径,并进行方法的调用

要求:若指定的目录有子目录,那么把子目录中的文件路径也打印出来

步骤:

         1. 指定要打印的目录File对象

         2. 调用getFileAll()方法

                   2.1 获取指定目录中的所有File对象

                   2.2 遍历得到每一个File对象

                   2.3 判断当前File 对象是否是目录

                            判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法

                            判断结果为false,说明是文件,打印文件的路径

代码演示:

import java.io.File;

/*
 *  对一个目录的下的所有内容,进行完全的遍历
 *  编程技巧,方法的递归调用,自己调用自己
 */
public class FileDemo {
	public static void main(String[] args) {
		File dir = new File("d:\\eclipse");
		getAllDir(dir);
	}
	/*
	 *  定义方法,实现目录的全遍历
	 */
	public static void getAllDir(File dir){
		System.out.println(dir);
		//调用方法listFiles()对目录,dir进行遍历
		File[] fileArr = dir.listFiles();
		for(File f : fileArr){
			//判断变量f表示的路径是不是文件夹
			if(f.isDirectory()){
				//是一个目录,就要去遍历这个目录
				//本方法,getAllDir,就是给个目录去遍历
				//继续调用getAllDir,传递他目录
				getAllDir(f);
			}else{
				System.out.println(f);
			}
		}
	}
}

 

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

需求:打印指定目录即所有子目录中的.java文件的文件路径

要求:编写一个方法用来打印指定目录中的.java文件路径,并进行方法的调用

若指定的目录有子目录,那么把子目录中的.java文件路径也打印出来

步骤:

         1. 指定要打印的目录File对象

         2. 调用getFileAll()方法,传入要打印的目录File对象

                   2.1 通过FilenameFilter过滤器获取指定目录中的所有.java类型的File对象

                   2.2 遍历得到每一个File对象

                   2.3 判断当前File 对象是否是目录

                            判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法

                            判断结果为false,说明是文件,打印文件的路径

import java.io.File;

/*
 *  遍历目录,获取目录下的所有.java文件
 *  遍历多级目录,方法递归实现
 *  遍历的过程中,使用过滤器
 */
public class FileDemo1 {
	public static void main(String[] args) {
		getAllJava(new File("c:\\demo"));
//		new File("c:\\demo").delete();
	}
	/*
	 * 定义方法,实现遍历指定目录
	 * 获取目录中所有的.java文件
	 */
	public static void getAllJava(File dir){
		//调用File对象方法listFiles()获取,加入过滤器
		File[] fileArr = dir.listFiles(new MyJavaFilter());
		for(File f : fileArr){
			//对f路径,判断是不是文件夹
			if(f.isDirectory()){
				//递归进入文件夹遍历
				getAllJava(f);
			}else{
				System.out.println(f);
			}
		}
	}
}

过滤器: 

import java.io.File;
import java.io.FileFilter;

public class MyJavaFilter implements FileFilter {
	public boolean accept(File pathname) {
		//判断获取的是目录,直接返回true
		if(pathname.isDirectory())
			return true;
		return pathname.getName().toLowerCase().endsWith(".java");//endsWith不区分大小写,需要先转为小写再判断
	}

}

 

第三章 总结

递归: 方法定义中调用方法本身的现象

直接递归

        public void methodA(){

            methodA();

        }

间接递归

        public void metohdB(){

            methodC();

        }

        public void methodC(){

            methodB();

        }

递归注意实现

要有出口,否则就是死递归

次数不能太多,否则就内存溢出

File: 文件和目录路径名的抽象表示形式

构造方法:

public File(String pathname) 通过给定的文件或文件夹的路径,来创建对应的File对象

public File(String parent, String child) 通过给定的父文件夹路径,与给定的文件名称或目录名称来创建对应的File对象

public File(File parent,  String child)通过给定的File对象的目录路径,与给定的文件夹名称或文件名称来创建对应的File对象

路径的分类:

-绝对路径, 带盘盘符

        E:\Workspace\day20_File\abc.txt

-相对路径, 不带盘符

day20_File\abc.txt

注意: 当指定一个文件路径的时候,如果采用的是相对路径,默认的目录为 项目的根目录

方法

  • public boolean createNewFile()创建文件

返回值为true, 说明创建文件成功;返回值为false,说明文件已存在,创建文件失败

  • public boolean mkdir() 创建单层文件夹

创建文件夹成功,返回 true;创建文件夹失败,返回 false

  • public boolean mkdirs() 创建多层文件夹
  • public boolean delete()   删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除
  • public boolean isDirectory() 判断是否为文件夹
  • public boolean isFile() 判断是否为文件
  • public boolean exists() 判断File对象对应的文件或文件夹是否存在
  • public String getAbsolutePath() 获取当前File的绝对路径
  • public String getName() 获取当前File对象的文件或文件夹名称
  • public long length() 获取当前File对象的文件或文件夹的大小(字节)
  • public File[] listFiles() 获取File所代表目录中所有文件或文件夹的绝对路径
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值