1、File类
File类的介绍:
1、File类和四大家族没有关系,所以File类不能完成文件的读和写
2、File对象代表什么? - 文件和目录路径名的抽象表示形式 - 例如: D:\java_study 这是一个File对象 D:\java_study\java_note.txt 这也是一个File对象 - 一个File对象有可能对应的是目录,也可能是文件。 File只是一个路径名的抽象表示形式。
File类构造方法:
常用的有三种:
1、File(String pathname):通过路径名创建一个新 File 实例。
2、File(File parent, String child):根据父目录路径File实例和子目录或文件路径创建一个新 File 实例。
3、File(String parent, String child) :根据父目录路径和子目录或文件路径创建一个新 File 实例。
public class FileDemo1 {
public static void main(String[] args) throws IOException {
// 1 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
File f1 = new File("F:\\a.txt");
System.out.println(f1); // F:\a.txt
// 2 File(String parent, String child) 父路径名字符串 和 子路径名字符串
File f2 = new File("F:\\abc", "a.txt");
System.out.println(f2); // F:\abc\a.txt
// 3 File(File parent, String child) 父抽象路径名 和 子路径字符串
File f3 = new File(new File("F:\\abc\\a"), "a.txt");
System.out.println(f3); // F:\abc\a\a.txt
/*错误示范:File类构造函数的本质就是将两个字符串连接起来,不会检验路径是否正确*/
File f4 = new File(new File("F:\\abc\\x.jpg"), "aa.txt");
System.out.println(f4); // F:\abc\x.jpg\aa.txt
}
}
其中的常用方法使用:
getAbsolutePath():获取绝对路径
public class FileTest2 {
public static void main(String[] args) {
File f1=new File("D:/aa/hello.txt");//创建了 文件 映射对象
String absolutePath1 = f1.getAbsolutePath();
System.out.println("文件的绝对路径"+absolutePath1);//绝对磁盘路径
}
}
getName():返回此对象表示的文件或目录最后一级文件夹名称
public class FileTest2 {
public static void main(String[] args) {
File f1=new File("D:/aa/hello.txt");//创建了 文件 映射对象
String name1 = f1.getName();//获取文件名,即你定位的元素
System.out.println("文件名称:"+name1);
}
}
getPath(): 返回File对象所表示的字符串路径
public class FileTest2 {
public static void main(String[] args) {
File f1=new File("D:/aa/hello.txt");//创建了 文件 映射对象
String path1 = f1.getPath();
System.out.println("文件的路径"+path1);
}
}
exists(): 判断文件/文件夹是否存在
public class FileTest2 {
public static void main(String[] args) {
File f1=new File("D:/aa/hello.txt");//创建了 文件 映射对象
System.out.println(f1.exists());
}
}
isDirectory(): 判断此File对象代表的路径表示是不是文件夹,只有File对象代表路径存在且是一个目录时才返回true,否则返回false
public class FileTest2 {
public static void main(String[] args) {
File f1=new File("D:/aa/hello.txt");//创建了 文件 映射对象
System.out.println(f1.isDirectory());
}
}
isFile():判断此File对象代表的路径是否是一个标准文件,只有File对代表路径存在且是一个标准文件时才返回true,否则返回false
public class FileTest2 {
public static void main(String[] args) {
File f1=new File("D:/aa/hello.txt");//创建了 文件 映射对象
System.out.println(f1.isFile());
}
}
注意事项:
- 当调用者不存在时,返回null
- 当调用者是一个文件时,返回null
- 当调用者是一个空文件夹时,返回一个长度为0的数组
- 当调用者是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
- 当调用者是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏内容
2、构造方法:
- public File(String pathname) : 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
- public File(String parent,String child) : 从父路径名字符串和子路径名字符串创建新的 File实例。
- public File(File parent,String child) : 从父抽象路径名和子路径名字符串创建新的 File实例。
import java.io.File;
public class FileTest2 {
public static void main(String[] args) {
//File的构造方法比较灵活,可以根据具体的需要选择使用
File f1=new File("D:/aa/hello.txt");
File f2=new File("d:/aa","hello.txt");
File file=new File("d:/aa");
File f3=new File(file,"hello.txt");
}
}
普通方法(常用)
1.当只是创建了文件对象时,可以调用方法在具体的路径下面创建文件或者文件夹。
- boolean mkdir() 在硬盘创建一个文件夹对象。
- boolean createNewFile() 在硬盘创建一个文件对象。
import java.io.File;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) throws IOException {
File f1=new File("d:/aa/bb/cc");
File f2=new File(f1,"a.txt");
//mkdir创建单个文件夹,mkdirs自动不全所有的月灵结构,推荐使用mkdirs
f1.mkdirs();
//1.月录结构不存在,程序异常:2.目录结构存在且文件不存在则创建空文件:3.目录结构存在且文件存在不做任何操作
f2.createNewFile();
}
}
创建和删除功能方法
- boolean createNewFile() 当且仅当当前该名称文件尚不存在时,创建一个新的文件
- boolean delete() 删除由此File表示的文件或目录,若要删除的是目录且目录里面有内容则
-
删除
public boolean delete() // 删除由此抽象路径名表示的文件或目录
注意事项:
- delete方法直接删除不走回收站
- 如果删除的是一个文件,直接删除
- 如果删除的是一个文件夹,需要先删除文件夹中的内容,最后才能删除文件夹
3、相对路径和绝对路径
- 绝对路径:从盘符开始
File file1 = new File(“D:\\itheima\\a.txt”);
- 相对路径:相对于当前项目下的路径
File file2 = new File(“a.txt”);
File file3 = new File(“模块名\\a.txt”);
绝对路径和相对路径的区别:
绝对路径:完整的路径名,不需要任何的其他信息就可以定位它所表示的文件。
相对路径:必须使用取自其他路径的信息进行解释。
删除目录的注意事项:
如果一个目录中有内容(目录,文件),不能直接删除。应该先删除该目录下的内容,最后删除该目录
package com.ithmm_01;
import java.io.File;
import java.io.IOException;
public class FileDemo04 {
public static void main(String[] args) throws IOException {
//需求1:在当前模块目录下创建java.txt 文件
File f = new File("Io\\java.txt");
//需求2:删除当前模块目录下的java.txt 文件
System.out.println(f.delete());
//需求3:在当前模块目录下创建ithmm目录
File f2 = new File("Io\\ithmm");
// System.out.println(f2.mkdir());
System.out.println(f2.delete());
//需求4:在当前模块目录下创建ithmm,然后在该目录下创建一个文件java.txt
File f3 = new File("Io\\ithmm");
System.out.println(f3.mkdir());
File f4 = new File("Io\\ithmm\\java.txt");
System.out.println(f4.createNewFile());
//需求6:删除当前目录ithmm,首先要删除该目录下的文件
System.out.println(f4.delete());
System.out.println(f3.delete());
}
}
不会删除
- boolean mkdir() 创建由此File表示的目录
- boolean mkdirs() 创建由此File表示的目录,包括任何必须但不存在的父目录
//在内存中创建一个文件夹对象,当前文件夹对象是指最后一级c
File dir2 = new File("D:/a/b/c");//file指代c文件夹。
//在硬盘创建多层级的文件夹对象。
boolean mkdirs = dir2.mkdirs();
4、目录的遍历
- public string[] list() : 返回一个String数组,表示该File目录中的所有子文件或目录。
- public File[] listFiles() : 返回一个Fle数组,表示该File目录中的所有的子文件或目录。
- 如果遍历的路径不是一个目录,则会抛出空指针异常
import java.io.File;
public class FileTest4 {
public static void main(String[] args) {
File dir=new File("d:\\java_code");
//获取当前目录下的文件以及文件夹的名称
String[] names=dir.list();
for (String name:names){
System.out.println(name);
}
//获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
File[] files=dir.listFiles();
for (File file:files){
System.out.println(file);
}
}
}
其他方法
boolean endsWith(String s); 后缀是否是字符串s
5、递归
5.1、概述
递归:指在当前方法内调用自己的这种现象。
5.2、递归的分类:
- 逃归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归
自己调用自己称之为递归 递(调用自己) 归(条件判断)
调用方法是递进入方法内部,方法反码执行完毕归来到调用的地方;
案例:
public class FileTest8 {
static int count=1;
public static void main(String[] args) {
//自己调用自己称之为递归 递(调用自己) 归(条件判断)
System.out.println("====1====");
System.out.println("====2====");
System.out.println("====3====");
fun();
System.out.println("====4====");
System.out.println("====5====");
System.out.println("====6====");
}
public static void fun(){
System.out.println("====fun1====");
System.out.println("====fun2====");
count++;
//判断终止条件
if(count>3){
return;
}
fun();
System.out.println("====fun3====");
System.out.println("====fun4====");
}
}
输出结果:
====1====
====2====
====3====
====fun1====
====fun2====
====fun1====
====fun2====
====fun1====
====fun2====
====fun3====
====fun4====
====fun3====
====fun4====
====4====
====5====
====6====
使用递归打印1-10
public class FileTest7 {
public static void main(String[] args) {
print(10);
}
public static void print(int n) {
System.out.println(n);
n--;
if (n>0){
print(n);
}else {
return;
}
}
}