概述
- java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
构造方法
public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
public class File_demo1 {
public static void main(String[] args) {
//绝对路径
File file1 = new File("E:\\IdeaProjects\\basic-code\\IO_code\\src\\FileDemo\\File_demo1.java");
System.out.println(file1.exists());
//相对路径,默认为当前项目的路径:E:\IdeaProjects\basic-code\demo1.txt
File file2 = new File("demo1.txt");
//System.out.println(file2.getAbsolutePath());
System.out.println(file2.exists());
String parent = "E:\\IdeaProjects\\basic-code\\IO_code\\src\\FileDemo";
String child = "File_demo1.java";
File file3 = new File(parent,child);
System.out.println(file3.exists());
//下面这个常用,可以修改子路径,来获得父路径下的所有文件
File parents = new File("E:\\IdeaProjects\\basic-code\\IO_code\\src\\FileDemo");
File file4 = new File(parents,child);
System.out.println(file4.exists());
}
}
true
true
true
true
绝对路径和相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径。
- 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
File类的创建功能
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean mkdir() :创建由此File表示的目录。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
public class File_Create {
public static void main(String[] args) throws IOException {
//创建文本文件
File file1 = new File("Create_file.txt");
System.out.println(file1.createNewFile());
//创建文件夹
File file2 = new File("文件夹");
System.out.println(file2.mkdir());
//创建多级文件夹
File file3 = new File("aaa//bbb");
System.out.println(file3.mkdirs());
}
}
File类的重命名和删除功能
public boolean delete() :删除由此File表示的文件或目录。
public boolean renameTo(File dest):把文件重命名为指定的文件路径。
public class file_delete {
public static void main(String[] args) {
//创建File对象
File file1 = new File("Create_file.txt");
//将Create.txt文件修改为abc.txt
System.out.println(file1.renameTo(new File("abc.txt")));
//删除多级文件夹
File file2 = new File("aaa//bbb");
System.out.println(file2.delete());
}
}
注意事项:
- 重命名注意事项
- 如果路径名相同,就是改名。
- 如果路径名不同,就是改名并剪切。
- 删除注意事项:
- Java中的删除不走回收站。
- 要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹。
File类的判断功能
* public boolean isDirectory():判断是否是目录。
* public boolean isFile():判断是否是文件。
* public boolean exists():判断是否存在。
* public boolean canRead():判断是否可读。
* public boolean canWrite():判断是否可写。
* public boolean isHidden():判断是否隐藏。
public class File_judge {
public static void main(String[] args) {
File file1 = new File("abc.txt");
//判断是否为文件夹
System.out.println(file1.isDirectory());
//判断是否为文件
System.out.println(file1.isFile());
//设置文件为不可读
file1.setReadable(false);
System.out.println(file1.canRead());//因为Windows认为所有文件都可读
//设置文件为不可写
file1.setWritable(false);
System.out.println(file1.canWrite());
//判断文件是否隐藏
System.out.println(file1.isHidden());
}
}
false
true
true
false
false
File类的获取功能
* public String getAbsolutePath():获取绝对路径
* public String getPath():获取路径
* public String getName():获取名称
* public long length():获取长度。字节数
public class File_get {
public static void main(String[] args) {
File file1 = new File("abc.txt");
File file2 = new File("E:\\IdeaProjects\\basic-code\\abc.txt");
//获取绝对路径
System.out.println(file1.getAbsolutePath());
System.out.println(file2.getAbsolutePath());
//获取构造方法里面传入的路径
System.out.println(file1.getPath());
System.out.println(file2.getAbsolutePath());
//获取文件名称
System.out.println(file1.getName());
System.out.println(file2.getName());
//获取文件长度
System.out.println(file1.length());
System.out.println(file2.length());
}
}
E:\IdeaProjects\basic-code\abc.txt
E:\IdeaProjects\basic-code\abc.txt
abc.txt
E:\IdeaProjects\basic-code\abc.txt
abc.txt
abc.txt
33
33
File类的遍历
* public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
* public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
public class File_list {
public static void main(String[] args) {
File dir = new File("E:\\IdeaProjects\\basic-code");
//获取指定目录下的所有文件或者文件夹的名称数组
String[] arr = dir.list();
for (String s : arr) {
System.out.println(s);
}
//获取指定目录下的所有文件或者文件夹的File数组
File[] list = dir.listFiles();
for (File file : list) {
System.out.println(file);
}
}
}
文件名称过滤器的概述及使用
* public String[] list(FilenameFilter filter)
* public File[] listFiles(FileFilter filter)
* 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。
练习:获取所有后缀名为.jpg的文件C:\Users\DELL-pc\Pictures
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
public class File_Filter {
public static void main(String[] args) {
//获取所有后缀名为.jpg的文件C:\Users\DELL-pc\Pictures
File file = new File("C:\\Users\\DELL-pc\\Pictures");
String[] arr1 = file.list();
for (String s : arr1) {
if (s.endsWith(".jpg")) {
System.out.println(s);
}
}
File[] arr2 = file.listFiles();
for (File file1 : arr2) {
if (file1.isFile() && file1.getName().endsWith(".jpg")) {
System.out.println(file1);
}
}
String[] arr3 = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file1 = new File(dir, name);
return file1.isFile() && file1.getName().endsWith(".jpg");
}
});
System.out.println(Arrays.toString(arr3));
}
}
Calvin Harris.jpg
Capital Cities.jpg
Nick Cannon.jpg
啥呀.jpg
头像.jpg
C:\Users\DELL-pc\Pictures\Calvin Harris.jpg
C:\Users\DELL-pc\Pictures\Capital Cities.jpg
C:\Users\DELL-pc\Pictures\Nick Cannon.jpg
C:\Users\DELL-pc\Pictures\啥呀.jpg
C:\Users\DELL-pc\Pictures\头像.jpg
[Calvin Harris.jpg, Capital Cities.jpg, Nick Cannon.jpg, 啥呀.jpg, 头像.jpg]
这种查询并不完善,只能遍历到当前文件夹,如果含有多级文件夹,就不能找到所有后缀名为.jpg的文件。
递归实现查找后缀名为.jpg的文件
import java.io.File;
import java.util.Arrays;
public class File_jpg {
public static void main(String[] args) {
File file = new File("C:\\Users\\DELL-pc\\Pictures");
System.out.println(Arrays.toString(file.list()));
getJpg(file);
}
public static void getJpg(File file){
File[] arr = file.listFiles();
if(arr != null){ //防止出现空指针异常
for (File dir : arr) {
if(dir.isFile() && dir.getName().endsWith(".jpg")){
System.out.println(dir);
}else {
getJpg(dir);
}
}
}
}
}
空指针原因:
- 1、因为遍历到C盘下的“System Volume Information”目录时,这是每个分区下都有的系统目录,用户没有访问权限调用listFiles方法会返回null。
- 2、只要碰见空文件夹listFiles()方法就返回null,所以会报空指针异常。
解决办法是if (arrf!=null)就行了。