File类学习,递归算法

File概述

位于java.io包下,表示文件或目录的抽象路径形式。

File构造方法

1. File(String pathname) 给定路径名字

根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例
注意:\ 是转义字符,用 \\
路径分割符:windows \\ ; linux / 路径`

File file = new File("E:\\File");

file的绝对路径就是:E:\File

2. File(File parent, String child) 给定父目录(File对象)跟子路径

根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例

File file = new File("E:\\File");
File file2 = new File(file,"a\\b.txt");

file2的绝对路径是:E:\File\a\b.txt

3. File(String parent, String child) 给定父目录跟子对象

根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
这个构造方法跟上一样,都是给定父目录跟子路径,不过上一个传的父目录是根据父File对象传的参。

File file3 = new File("E:\\File","a\\b.txt");

file3的绝对路径是:E:\File\a\b.txt

绝对路径和相对路径

绝对路径:绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。Location
如:E:\\abc\a.txt 。 一般是从盘符开始的,绝对位置的路径

相对路径:由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系 (从某个路径开始的路径,相对于某个路径的路径。)Path
如:\a.txt
注意:javase中相对路径,是当前项目的路径
相对路径如果加“//”,代表项目的根盘符

相对路径案例:

public static void main(String[] args) {
		
		//相对路径,是当前项目的路径
		File file = new File("File");
		System.out.println(file.getAbsolutePath()); 
		//注意,如果加“//”,代表当前根盘符
		File file2 = new File("\\File");
		System.out.println(file2.getAbsolutePath());
}

运行结果:
E:\Java_Base_Project\eclipse_project\myproject\File
E:\File
这个时候就能想起来css的position属性了。回忆一下,position:absolute绝对位置,是在页面上的绝对位置,向下滚动滚动条,他也会跟着动,相当于固定在页面上。而绝对位置(position:relative)是相对于浏览器,不管页面怎么动他都在哪个位置。悬浮一样。

File类常用方法

方法名描述
isDirectory();判断是不是一个目录,不存在返回false
isFile();判断是不是一个文件,不存在返回false
exists();判断文件或目录是否存在,boolean
mkdir();创建目录,但是没有父目录的话不能创建并返回false。创建的目录如果存在返回false
mkdirs();创建目录,没有父目录的话,可以创建父目录;创建的目录如果存在返回false
createNewFile();创建一个新的空的文件,如果已存在返回false
static File createTempFile(String prefix, String suffix);在默认目录创建一个空的临时文件 ,后缀默认是.temp Win7默认路径:C:\Users\Administrator\AppData\Local\Temp
static File createTempFile(String prefix, String suffix, File directory)在指定目录创建临时文件,后缀默认是.temp ;
delete();删除此抽象路径名表示的文件或目录,只能删除空目录,或者文件
getAbsolutePath();获取文件或目录的绝对路径 ,String
getPath();获取文件或目录名,String
getParent();获取父目录,String
getParentFile();获取父目录,返回文件,File
lastModified()返回最后一次被修改时间,long
length();返回的是文件的长度,注意只表示文件的字节长度,文件夹的长度不定,long
renameTo(File dest);重命名。 当同一个目录下时,为重命名,如果不在同一个目录下,是剪切操作。 boolean
getName()返回文件名,带后缀
练习代码
	public static void main(String[] args) throws IOException {
		File file = new File("E:\\File\\1.txt");
		//判断方法。
		boolean flag1 = file.isDirectory();//判断是不是一个存在路径
		boolean flag2 = file.isFile();//判断是不是一个标准文件
		boolean existsFlag = file.exists();//判断文件或目录是否存在
		System.out.println("判断是不是一个存在路径:"+flag1);
		System.out.println("判断是不是一个标准文件:"+flag2);
		System.out.println("判断文件或目录是否存在:"+existsFlag);
		//创建目录方法
		boolean flag3 = file.mkdir();//创建不存在的目录,但是没有父目录的话不能创建。创建存在目录即同名目录返回false
		System.out.println("mkdir,创建目录"+flag3);
		boolean flag4 = file.mkdirs();//创建不存在的目录,没有父目录的话,可以创建父目录;创建存在目录即同名目录返回false
		System.out.println("mkdirs(),创建目录,包括父目录:"+flag4);
		
		
		//创建文件方法
		boolean flag5 = file.createNewFile();//当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
		System.out.println("创建一个新的空文件:"+flag5);
		File fileCreate1 = file.createTempFile("zhang", ".txt"); //在默认目录创建临时文件:windows默认路径C:\Users\Administrator\AppData\Local\Temp
		System.out.println("在默认目录创建临时文件,绝对路径:"+fileCreate1.getAbsolutePath());
		File fileCreate2 = file.createTempFile("youyou", ".png", file); //在指定目录创建临时文件
		System.out.println("在指定目录创建临时文件:"+fileCreate2);
		System.out.println("Path路径:"+fileCreate2.getPath());
		System.out.println("getName(),文件名:"+fileCreate2.getName());
		System.out.println("getParent(),父目录:"+fileCreate2.getParent());
		System.out.println("getParentFile(),父文件:"+fileCreate2.getParentFile());
		//删除方法
		File file2 = new File("E://File");
		boolean deleteFlag = file2.delete();//删除此抽象路径名表示的文件或目录,只能删除空目录,或者文件
		System.out.println("删除非空文件目录:"+deleteFlag);
		
		boolean deleteFlag2 = file.delete();
		System.out.println("删除文件或目录:"+deleteFlag2);
		
		File file3 = new File("E:\\abcde");
		System.out.println(file3.isDirectory());
		System.out.println(file3.isFile());
		System.out.println(file3.isHidden());
		System.out.println(file3.isAbsolute());
		
	}
	
	public static void main(String[] args) throws IOException {
		File file = new File("\\File","1");
		System.out.println(file.getCanonicalPath());//返回此抽象路径名的规范路径名字符串。
		System.out.println(file.mkdir());
		
		File file1 = new File("\\File", "1\\1.txt");
		System.out.println(file1.getAbsolutePath());
		file1.createNewFile();
		System.out.println(file1.equals(file));
		
	**	System.out.println(file1.lastModified());
		
		System.out.println(new SimpleDateFormat("yyyy-MM-dd hh-mm-ss")
				.format(new Date(file1.lastModified())));
		
	**	System.out.println("文件长度:"+file1.length());//如果文件不为空,返回字节长度。为空返回0
	**	System.out.println("目录长度:"+file.length());//目录返回值不确定
	}

File遍历方法

1.listFiles() /list() 返回的是目录中的文件夹和文件。(不包括子目录中文件夹和文件)
2.listFiles(FileFilter filter) 带有过滤器的文件遍历。
FileFilter过滤器: 筛选 ,符合要求的通过,不符合要求的不让通过。
练习:

public class FileMethodStudy1 {
	public static void main(String[] args) {
		File file = new File("\\File");
		
		**//1. list() //只能获取到直接子目录和子文件。子目录里的获取不到**
		String[] stringList = file.list();
		for (String sName : stringList) {
			System.out.println(sName);
		}
		System.out.println("-----------------------");
		
		**//2. listFile()**
		File[] filesList = file.listFiles();
		for (File file2 : filesList) {
			System.out.println(file2);
		}
		System.out.println("-----------------------");
		**//3 listFile(FileFilter f) //获取文件目录**
		File[] filesFilterList = file.listFiles(new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				//可以用 isDirctory() 判断是不是目录
				//返回不是txt结尾的文件
				return !pathname.getName().endsWith(".txt");
			}
		});
		for (File file2 : filesFilterList) {
			System.out.println(file2);
		}
		System.out.println("-----------------------");
		
		**//4. listFile(FileFilter f) //获取文件**
		File[] filesFilterList1 = file.listFiles(new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				return pathname.getName().endsWith(".txt");
			}
		});
		
		if (filesFilterList1 != null) {
			for (File file2 : filesFilterList1) {
				System.out.println(file2);
			}
		}
		System.out.println("-----------------------");
		
		**//5 输出所有目录跟文件**
		getFileList(file);//递归 输出所有目录跟文件
		System.out.println("-----------------------");
		
	}
	//递归思想,输出目录中所有文件,包括子目录中的
	public static void getFileList(File file) {
		//获取所有
		File[] filesFilterList = file.listFiles();
		if (filesFilterList != null) {
			for (File file2 : filesFilterList) {
				if(file2.isDirectory()) {
					System.out.println("目录:"+file2.getAbsolutePath());
					getFileList(file2);
				}else {
					System.out.println("文件:"+file2.getAbsolutePath());
				}
			}
		}
	}

}

递归

递归就是,自己调用自己。递归使用必须有出口,否则会报StackOverflowError 栈溢出异常
(1)两种形式:
①直接递归
如:方法A,自身调自身
②间接递归
如:方法A,调用了方法B,方法B中调用了方法C,方法C中调用了方法A.

学习案例1:

/**
* 作者: 帅的一批
* 时间:2019年12月11日下午4:23:22
* 学习:递归
* 内容:
* 		1.如果是正数就从1乘到这个数,如果是负数,就从-1乘到这个数
* 		2.求任意数到0的和
*/
public class RecursionStudy {
   public static void main(String[] args) {
   	System.out.println(jieCheng(-6));
   	
   	System.out.println(getSumToZero(-10));
   }
   //名字是阶乘,但是阶乘没有负数,学习用
   public static int jieCheng(int n) {
   	if(n == 0) {
   		return 1;
   	}else if (n == 1) {
   		return 1;
   	}else if (n == -1) {
   		return -1;
   	}else if (n > 0) {
   		return n*jieCheng(n-1); 
   	}else {
   		return n*jieCheng(n+1);
   	}
   	
   }
   //
   public static int getSumToZero(int n) {
   	if(n == 0) {
   		return 0;
   	}else if (n > 0) {
   		return n+getSumToZero(n-1);
   	}else {
   		return n+getSumToZero(n+1);
   	}
   }
   
}

学习案例2: 斐波那契数列

/**
* 作者: 帅的一批
* 时间:2019年12月11日下午4:57:19
* 学习:递归
* 内容:斐波那契数列
* 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少
* n=3  n=(n-1)+(n-2)
* 1, 1, 2,  3, 5, 8,  13, 21, 34,  55, 89, 144,  233,377,610,987,1597,2584 ,4181,6765,10946,17711,28657,46368
*/
public class RecursionStudy1 {
   public static void main(String[] args) {
   	System.out.println(fun(24));
   }
   
   public static int fun(int n) {
   	if(n > 0 && n < 3) {
   		return 1;
   	}else {
   		return fun(n-1)+fun(n-2);
   	}
   }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值