java入门(三十七)
File
-
File类概述和构造方法
-
File类在java.io下。File是文件和目录路径名的抽象表示,文件和目录可以通过File封装成对象。对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。他可以是存在的,也可以是不存在的,将来是要通过具体的操作把这个路径的内容转换为具体存在的。
-
File有四个构造方法
方法名 | 说明 |
---|---|
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径明来创建新的File实例 |
File(Stirng parent,String child) | 从父路径字符串和子路径字符串创建新的File实例 |
File(File parent,String child) | 从父抽象路径名和子路径名字字符串创建新的File实例 |
import java.io.File;
public class FileDemo01 {
public static void main(String[] args) {
File f1 = new File("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/java.txt");
System.out.println(f1);
}
}
- 下面只是抽象表示文件路径,没有说明文件实际存在,而他输出文件路径名,所以File类重写了tostring方法。
- 下面表示方法也是封装同样路径下单java.txt文件。
File f2 = new File("/home/ding/IdeaProjects/Study/src/com/itheima_02/file","java.txt");
System.out.println(f2);
- 第三个构造方法输出也一样,由此可见他们做了同一件事情。
File f3 = new File("/home/ding/IdeaProjects/Study/src/com/itheima_02/file");
File f4 = new File(f3,"java.txt");
System.out.println(f4);
File类创建功能
方法名 | |
---|---|
public boolean createNewFile() | 当具有该名称的文件不存在时,创建一个由该抽象路径命名的新空文件 |
public boolean mkdir() | 创建由此抽象路径命名的目录 |
public boolean mkdirs | 创建由此抽象路径命名的目录,包括任何必须但不存在的父目录 |
public class FileDemo02 {
public static void main(String[] args) throws IOException {
///home/ding/IdeaProjects/Study/src/com/itheima_02/file/
//创建一个文件java.txt
File f1 = new File("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/java.txt");
System.out.println(f1.createNewFile());
}
}
- 可以看到新建了一个空文件java.txt。但是存在了之后再次执行,因为没办法创建同名文件所以会返回false
- 需求2,再目录下创建一个目录
//创建一个目录
File f2 = new File("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/JavaSE");
System.out.println(f2.mkdir());
- 创建一个多级目录
//创建多级目录
File f3 = new File("/home/ding/IdeaProjects/Study/src/com/itheima_02/file/JavaWEB/HTML");
System.out.println(f3.mkdirs());
- 需求4,创建一个文件javase.txt。不能根据路径判断最终是路径还是文件名,应该根据调用的方法判断。
File类判断和获取功能
方法名 | 说明 |
---|---|
public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
public boolean exists() | 测试此抽象路径名表示File是否存在 |
public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
public String getPath() | 将此抽象路径名转换为路径名字符串 |
public String getName() | 返回此抽象路径名表示的文件或目录的名称 |
public String[] list() | 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 |
public File[] listFiles() | 返回此抽象路径名表示目录中的文件和目录的File对象数组 |
import java.io.File;
public class FileDemo01 {
public static void main(String[] args) {
File f = new File("java.txt");
System.out.println(f);
System.out.println(f.isDirectory());
System.out.println(f.isFile());
System.out.println(f.exists());
System.out.println(f.getAbsolutePath());
System.out.println(f.getPath());
}
}
File f2 = new File("/Users/mac/JavaSE/基础语法/src/Pack");
String[] strArray = f2.list();
for(String str : strArray){
System.out.println(str);
}
File[] fileArray = f2.listFiles();
for(File file : fileArray){
System.out.println(file);
}
System.out.println(file.getName());
for(File file : fileArray){
// System.out.println(file.getName());
if(file.isFile()){
System.out.println(file.getName());
}
}
File类的删除功能
方法名 | 说明 |
---|---|
public boolean delete() | 删除由此抽象路径名表示的文件或目录 |
import java.io.File;
import java.io.IOException;
public class FileDemo03 {
public static void main(String[] args) throws IOException {
// /Users/mac/JavaSE/基础语法/src/Pack
File f1 = new File("/Users/mac/JavaSE/基础语法/src/Pack/java3.txt");
System.out.println(f1.createNewFile());
}
}
- 删除刚才创建的文件
System.out.println(f1.delete());
- 创建目录
File f2 = new File("/Users/mac/JavaSE/基础语法/src/Pack/itcast");
System.out.println(f2.mkdir());
- 删除刚才创建的目录
System.out.println(f2.delete());
- 在当前模块下创建一个目录itcast,然后在目录下创建一个文件java.txt
File f3 = new File("/Users/mac/JavaSE/基础语法/src/Pack/itcast");
System.out.println(f3.mkdir());
File f4 = new File("/Users/mac/JavaSE/基础语法/src/Pack/itcast/java.txt");
System.out.println(f4.createNewFile());
- 假如创建一个上级目录不存在的文件,会抛出IOException的异常
- 删除模块下有文件的目录,控制台会返回false。需要把目录下文件删除完毕才能够删除目录。
System.out.println(f3.delete());
递归
- 递归概述:以编程的角度,递归指的是方法定义中调用方法本身的现象。
public class DiGuiDemo01 {
public static void main(String[] args) {
//求第20个月兔子的对数
//每个月的兔子对数:1,1,2,3,5,8 , 13 , 21 , 34 , 55 ,89 , 144 , 233 ,
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for(int i = 2; i< arr.length; i++){
arr[i] = arr[i - 1] + arr[i - 2];
}
System.out.println(arr[19]);
}
}
- 递归解决问题首先就是要定义一个方法,定义一个方法f(n),假如f(n)表示第n个月兔子对数,那么第(n-1) 月兔子对数该如何表示呢?f(n-1) 。同理第二个月就是 f(n-2) 。那么我们定义这个方法
public static int f(int n){
return f(n-1) + f(n - 2);
}
- 假如调用这个方法的时候输出第20个月兔子对数,也应该是6765
System.out.println(f(20));
- 结果却报错了
- 这是一个当堆栈溢出发生时抛出一个应用程序递归太深的error。这是因为 f(n-1)+f(n-2)会不断调用f(n),他没有定义停止的条件。所以递归解决问题,他一定要有出口,否则递归太深导致内存溢出。
public static int f(int n){
if (n==1 || n ==2){
return 1 ;
}
return f(n-1) + f(n - 2);
}
- 递归解决问题的思路:将一个复杂问题层层转化为一个与原问题相似的规模较小的问题起来求解。递归策略只需要少量程序就可以描述出解题过程中多次重复计算。
递归求阶乘
- 用递归求5的阶乘,并把结果再控制台输出。阶乘:一个正整数的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n!
5! = 5 * 4 * 3 * 2 * 1
- 递归出口: 1! = 1
- 递归规则: n! = n *(n-1)!
5! = 5 * 4
- 思路:
- 定义一个方法,用于递归求阶乘,参数为一个int类型的变量
- 在方法内部判断该变量的值是否为1 ,如果是:返回1,如果不是:返回n*(n-1)!
- 调用方法
- 输出结果
public class DiGuiDemo03 {
public static void main(String[] args) {
System.out.println(jc(5));
}
public static int jc(int n){
if(n == 1){
return 1;
} else {
return n * jc(n - 1);
}
}
}
遍历目录
- 给定一个路径,请通过递归完成遍历该目录下所有的内容,并把所有文件的绝对路径输出在控制台上。
- 思路:
- 根据给定的路径创建一个File对象
- 定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象。
- 获取给定的File目录下所有的文件或者目录的File数组
- 遍历该File数组,得到每一个File对象
- 判断该File对象是否为目录。是:递归调用。不是:获取绝对路径输出在控制台。
- 调用方法
import java.io.File;
public class DiGuiDemo04 {
public static void main(String[] args) {
File srcFile = new File("/Users/mac/JavaSE/基础语法/src/Pack");
getAllFilePath(srcFile);
}
public static void getAllFilePath(File srcFile){
File[] fileArray = srcFile.listFiles();
if(fileArray != null){
for (File file : fileArray){
if(file.isDirectory()){
getAllFilePath(file);
} else {
System.out.println(file.getAbsolutePath());
}
}
}
}
}