File – 文件类
注意:File – 文件类,但不仅仅只表示文件,也可以是目录/文件夹
构造方法
1.new File(String 文件路径)
注意: new 出来的File对象, 只是在JVM内存中有一个对象而已,和本地磁盘有没有这个文件, 无关 !a.txt不一定存在
@Test
public void test01(){
// 传入文件路径, 构造File对象
// 注意: new 出来的File对象, 只是在JVM内存中有一个对象而已
// 和本地磁盘有没有这个文件, 无关 !
File file = new File("a.txt");
System.out.println(file);
}
2.new File(String 父路径, String 子路径)
@Test
public void test02() {
// 传入文件父路径 和 子路径, 共同构造File对象
File file = new File("b/c","d/a.txt");
System.out.println(file); // b/c/d/a.txt
}
File常用API
1.getAbsolutePath(); – 获得文件/目录的绝对路径
@Test
public void test01Path() {
File file = new File("a.txt");
// 获得file的绝对路径
String path = file.getAbsolutePath();
// /Users/bonnie/IdeaWorks/corejava/API_day09/a.txt
System.out.println(path);
}
2.exists(); – file对应的文件或者目录存不存在
@Test
public void test02() {
File file = new File("src");
// file对应的文件或者目录存不存在
boolean exists = file.exists();
System.out.println("src 存不存在:" + exists);
}
3.isFile()/isDirectory(); – 是文件/是目录
@Test
public void test03() {
File file = new File("src"); // 目录, 并且存在
System.out.println("src是目录吗? " + file.isDirectory());
System.out.println("src是文件吗? " + file.isFile());
4.createNewFile(); – 创建一个文件
@Test
public void test04() throws IOException {
// 创建一个文件
File file2 = new File("a.txt");
// file2.exists() 返回true, 就表示存在, 就不能创建新文件
// 如果文件不存在, 就创建这个文件
// 如果文件存在, 就不创建, 也不会报错
file2.createNewFile();
}
5.mkdir(); – 创建目录
@Test
public void test05() throws IOException {
File file2 = new File("dir");
// 创建目录
file2.mkdir();
}
File file2 = new File("test/a/b");
// 创建目录, 并且可以将不存在的父目录一起创建
file2.mkdirs();
6.listFiles()/list(); – listFiles():获得file对象中所有的文件
@Test
public void test07(){
// 创建一个file对象, .表示的是当前module目录 API_day09
File file = new File(".");
// 列出这个目录中所有的文件和目录 File对象
File[] files = file.listFiles();
for(File f : files) {
System.out.println(f);
}
//.\a.txt
//.\a_bak.txt
//.\d.txt
//.\day20.iml
System.out.println("-----------");
// 列出file目录下, 所有的文件和目录的名字 -- 了解
String[] ss = file.list();
for (String s : ss) {
System.out.println(s);
}
//a.txt
}
7.listFiles(FileFilter filter); --listFiles中的过滤器
返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
@Test
public void test08() {
File file = new File(".");
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
// 只想保留文件, 不想保留目录
return f.isFile();
}
});
System.out.println(Arrays.toString(files));
File[] files1 = file.listFiles((File f) -> {
// 只想保留 txt 文件
String name = f.getName();
return name.endsWith(".txt");
});
System.out.println(Arrays.toString(files1));
// 所有文件都保留
file.listFiles(f -> true);
}
}
@Test
//FileFilter();-->过滤器---函数式接口--可以用Lambda表达式,可以用匿名表达式
public void test8() {
File file=new File(".");
File[] file1=file.listFiles(new FileFilter() {
@Override
//boolean accept();-->FileFilter()里唯一的方法
//boolean accept()方法的结论:返回true的文件保存;返回false的文件不保留
public boolean accept(File f) {
//return f.isFile();//只想保留文件
//return true;--->所有文件都保留
//return false;--->所有文件都不保留
String name =f.getName();
return name.endsWith(".sta"); //只想保留txt文件
}
});
System.out.println(Arrays.toString(file1));
}
递归删除非空目录
public void deleteFile(File file) {
//结束递归的条件:1.file对象本身就是文件; 2.file对象是空目录
File[] file1 = file.listFiles();
//递归删除的前提:file对象不为空
if (file1 != null) {
for (File f : file1) {
deleteFile(f);//递归---自己调用自己
}
}
file.delete();
}
路径 - 绝对路径/相对路径
绝对路径
绝对路径: window是 - 从盘符开始 C:\xx\xx…
Linux是 - /xx/xx (从根目录开始)
以/开头的都是绝对路径
相对路径
相对路径: 会有一个参照对象 a.txt
参考值 我们称之为 - 当前目录
参考值: /Users/bonnie/Desktop 相对路径是: a.txt
那么a.txt的真实路径: /Users/bonnie/Desktop/a.txt
现在a.txt的真实路径: /Users/bonnie/IdeaWorks/corejava/API_day09/a.txt
那么现在的参考值: /Users/bonnie/IdeaWorks/corejava/API_day09
参考值: C:\IdeaWorks\day09\src 相对路径: com/zzxx/demo01/a.txt
那么a.txt的真实路径: C:/IdeaWorks/day09/src/com/zzxx/demo01/a.txt
. : 当前目录 - 现在的参考值
…: 上一级目录 - 现在的参考值 往上一层
相对路径获取绝对路径
1.xx.class.getResource(“相对路径”) -> 得到一个绝对路径
2.xx.class.getClassLoader().getResource(“相对路径”) -> 得到一个绝对路径. (ClassLoader() – 类加载器)
[注] 以上两种方法得到的不是一个字符串,而是一个URL,想要得到路径字符串,可再后面加getPath()或getFile()方法.
@Test
public void test02() {
String path = Demo03Path.class.
getResource("a.txt").getPath();
// a.txt 路径的参考值: 当前类的编译目录 - 就是当前这个包
// 直接理解为: a.txt 和 当前这个类 同一个包
// /Users/bonnie/IdeaWorks/corejava/out/production/API_day09/com/zzxx/a_file/a.txt
System.out.println(path);
}
@Test
public void test03() {
String path = Demo03Path.class.getClassLoader()
.getResource("b.txt").getPath();
// b.txt 路径的参考值: 当前这个模块编译后的根目录 classpath - 类路径
// 直接理解为: b.txt 就是在src下的
// /Users/bonnie/IdeaWorks/corejava/out/production/API_day09/b.txt
System.out.println(path);
}
}
补充:
1.类路径 classpath: 就是src编译后的目录, 也叫编译根目录
2.以上 1 和 2 代码得到的绝对路径, 都是在编译后的目录中, 和src没有直接关系
3.在开发中, 我们是先将文件放入src中的, 会自动编译到类路径中