File类和递归

一.File类

在这里插入图片描述
一. File类的创建
1.File类定义:
java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
2.用构造方法创建File类
1).public File(String pathname) //通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

  eg:
   String pathname="D:\\aa.txt";//定义一个路径
	File file1=new File(pathname); 
	System.out.println(file1);

2).public File(String parent, String child) //从父路径名字符串和子路径名字符串创建新的 File实例。

  eg:
   String parent="d:\\aaa";//定义父路径
	String child="bbb.txt";//定义子路径
	File file=new File(parent,child);

3).public File(File parent, String child) //从父抽象路径名和子路径名字符串创建新的 File实例。

   eg:
    File parentDir=new File("d:\\aaa");
	String child1="bbb.txt";
	File files=new File(parentDir,child);

3.创建文件或目录
1)文件的创建
public boolean createNewFile() //当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
2)目录的创建
(1)创建单级目录:public boolean mkdir() //创建由此File表示的目录,包括任何必需但不存在的父目录。
(2)创建多级目录:public boolean mkdirs()

PS:
1.一个File对象代表硬盘中实际存在的一个文件或者目录。
2.无论该路径下是否存在文件或者目录,都不影响File对象的创建。
3.因为创建File时不知道是创建的文件还是目录,所以需要有特定方法进行判断。
4.关于分隔符:
1)路径分隔符windows;linux
2)文件名称分隔符window :反斜杠\ Linux: /正斜杠
正斜杠可以一个,反斜杠必须两个。

二.绝对路径和相对路径
1.绝对路径:从盘符开始的路径,这是一个完整的路径。

eg:
    File f=new File("D:\\aaa.java");//D盘下bbb.java-->绝对路径
	System.out.println(f.getAbsolutePath());//输出结果D:\aaa.java

2.相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。

eg:
     File f2=new File("aaa.java");//项目下bbb.java-->相对路径
	System.out.println(f2.getAbsolutePath());
	//输出结果C:\Users\pc\eclipse-workspace\RemoteSystemsTempFiles\FileDemo01\aaa.java

三.File类常用方法
1.基本方法:
1) public String getAbsolutePath() //返回此File的绝对路径名字符串。
2) public String getPath() //将此File转换为路径名字符串。
3) public String getName() //返回由此File表示的文件或目录的名称。
4) public long length() //返回由此File表示的文件的长度。
5) public boolean delete() //删除由此File表示的文件或目录。
PS: API中说明: delete方法,如果此File表示目录,则目录必须为空才能删除。
2.判断功能的方法
1) public boolean exists() //此File表示的文件或目录是否实际存在。
2) public boolean isDirectory() //此File表示的是否为目录。
3) public boolean isFile() //此File表示的是否为文件。
四.遍历目录下的文件
1. public String[] list() //返回一个String数组,表示该File目录中的所有子文件或目录。

 eg:
   File dir=new File("d:\\Java_Code");
	String[] names=dir.list();
	for(String name:names) {
		System.out.println(name);//输出文件或子文件名字
	}
  1. public File[] listFiles() //返回一个File数组,表示该File目录中的所有的子文件或目录。

    eg:
     File[] files=dir.listFiles();
     for (File file : files) {
    	 System.out.println(file);//输出文件或子文件具体路径
     }
    

二.递归

在这里插入图片描述
一.递归
1.递归概念:指在当前方法中调用自己的现象。
2.递归分类:
1) 直接递归即为方法自身调用自己。
2) 间接递归可以理解为A方法调用B方法,B方法调用C方法,C方法调用A方法。
二.递归使用注意事项
1. 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
3.构造方法,禁止递归
三.递归经典实例
1.累加求和
即求n+(n-1)+…+1

   public class Demo01{
	   private static int sum(int n) {
			if(n==1) {
				return 1;
			}
		return n+sum(n-1);
	   }
	    public static void main(String[] args) {
			int s=sum(5);//求1~5之和
			System.out.println(s);
	    }
   }

2.递归求阶乘
即求n*(n-1)*…*1

    public class Demo02 {
	//递归算法求阶乘
		 private static int getValue(int n) {
			 if(n==1) {
				return 1;
			 }
			return n*getValue(n-1);
		}
		public static void main(String[] args) {
				int s=getValue(10);
				System.out.println(s);
	   	}
     }

3.递归打印多级目录
递归打印多级目录,即为遍历多级目录,目录的嵌套,打印输出

import java.io.File;
import java.nio.file.Files;

public class demo03 {
	
	private static void printDir(File dir) {
		File[] files=dir.listFiles();
		//判断:当是文件,打印绝对路径
		//    当是目录时,打印目录,继续调用打印目录形成递归
		for (File file : files) {
			//是文件时
			if(file.isFile()) {
				System.out.println("文件名"+file.getAbsolutePath());
			}else {
				//是目录,输出目录绝对路径
				System.out.println("目录"+file.getAbsolutePath());
				//继续遍历,调用printDir,形成递归
				printDir(file);
			}
		 }
       }

		public static void main(String[] args) {
			File dir=new File("D:\\aaa");
			printDir(dir);
		 }
    }

四.递归与File类综合实例
文件搜索 ----》搜索D:\aaa目录中.java文件
1) 常规方法:

 import java.io.File;

 public class Demo04{

	public static void main(String[] args) {
		File file=new File("D:\\aaa");
		printDir(file);
	}
	private static void printDir(File dir) {
		File[] files=dir.listFiles();
		//循环打印
		for (File file : files) {
			if(file.isFile()) {
				//File是文件,判断文件名并输出文件绝对路径
				if(file.getName().endsWith(".java")) {
					//prefix(前缀)+.suffix(后缀) 
					System.out.println("文件名"+file.getAbsolutePath());
				}
				
			}else {
				//File是目录,继续遍历,形成递归
				printDir(file);
			}
		}	
	}
 }

2)文件过滤器优化FileFilter

import java.io.File;

import javax.swing.filechooser.FileFilter;

public class Demo06DiGui2 {

	public static void main(String[] args) {
		File file=new File("D:\\aaa");
		printDir(file);

	}
	private static void printDir(File dir) {
	   //FileFilter过滤器优化及Lambda表达式优化
		File[] files=dir.listFiles(new FileFilter(){
			@Override
			public boolean accept(File pathname) {				
				return pathname.getName().endsWith(".java");
			}
		});
		//lambda优化   ()(参数)->{业务实现}
		//有参有返回值lambda表达式
		File[] files=dir.listFiles(f->{return f.getName().endsWith(".java")||f.isFile();});
		//循环打印
		for (File file : files) {
			if(file.isFile()) {
				//是文件,判断文件名并输出文件绝对路径
				if(file.getName().endsWith(".java")) {
					System.out.println("文件名"+file.getAbsolutePath());
				}
			}else {
				//是目录,继续遍历,形成递归
				printDir(file);
			}
		}	
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章