File类概述
File类与IO流
- IO流的作用就是进行设备之间的数据传输,数据在计算机上是以文件的形式存储的。我们常见的文件有文本文件、音频文件、视频文件……,Java为了描述文件和文件夹,给我们提供了一个类File。
- 在File类中封装了对用户机器的文件系统进行操作的功能。例如,可用File类获得文件上次修改的时间移动,或者对文件进行删除、重命名。换句话说,流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。
File类的构造方法
public File(File parent, String child)
根据 parent 抽象路径名表示的目录,child 路径名字符串表示的目录或文件创建一个File实例。
File file3 = new File("C:\\Users\\scq\\Desktop");
File file4 = new File(file3, "test");
System.out.println(file4);//C:\Users\scq\Desktop\test
File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File file=new File("C:\\Users\\scq\\Desktop\\test.txt");
System.out.println(file);//C:\Users\scq\Desktop\test.txt
File file1=new File("C:\\Users\\scq\\Desktop\\test");
System.out.println(file1);//C:\Users\scq\Desktop\test
File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File file2 = new File("C:\\Users\\scq\\Desktop", "test");
System.out.println(file2);//C:\Users\scq\Desktop\test
注意:
-
文件路径分隔符的写法,如果是写上坡杠,就写两个代表转义,例如:
D:\\桌面图标\\文件程序练习打包\\test;
如果是写下坡杠,就写一个,例如:D:/桌面图标/文件程序练习打包/test;
-
三个构造方法都有它们的用途,需要注意的是,new出来的文件对象如果所给的文件名是不存在的,则对这个构造器的调用不会创建使用这个名字的新文件。
绝对路径与相对路径
- 绝对路径指的是带有盘符号的一个详细路径,比如:D:/桌面图标/文件程序练习打包/test;
- 相对路径指的是不带有盘符号的路径,Java程序中的相对路径指的是项目根目录下的路径,也就是目前执行虚拟机的处理程序的当前目录;
//Java中的相对路径:Java工程的文件夹的根目录
File file5 = new File("a.txt"); //注意此时文件并没有创建出来
System.out.println(file5);//a.txt
路径的简写形式:
./ 代表当前目录,我们可以动态的获取相对路径;
…/ 代表上一级目录;
…/…/ 代表上两级目录;
import java.io.File;
import java.io.IOException;
public class MyTest {
public static void main(String[] args) throws IOException {
File file1 = new File("./a.txt");
File file2 = new File("../b.txt");
File file3 = new File("../../c.txt");
//创建一个新文件,返回值为true代表创建成功
System.out.println(file1.createNewFile());
System.out.println(file2.createNewFile());
System.out.println(file3.createNewFile());
/*true
true
true*/
}
}
File类的使用
创建文件
在构造方法里面得知,如果给定的目录不存在,构造方法是不会自动创建该文件的;
File类里面专门提供了createNewFile()
来创建文件,只有当不存在指定名字的文件时,该方法才会创建文件,而且返回的布尔类型的值用于表示是否成功;
public boolean createNewFile() throws IOException
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。检查文件是否存在,若不存在则创建该文件;
import java.io.File;
import java.io.IOException;
public class MyTest {
public static void main(String[] args) {
File file = new File("D:\\桌面图标\\文件程序练习打包\\test", "a.txt");
try {
boolean b = file.createNewFile();
System.out.println("文件创建结果是:" + b);
// 文件创建结果是:true
} catch (IOException e) {
e.printStackTrace();
}
}
}
创建单级文件夹
public boolean mkdir()
———创建此抽象路径名指定的目录,当且仅当已创建目录时,返回 true;否则返回 false
public class MyTest {
public static void main(String[] args) {
File file = new File("D:\\桌面图标\\文件程序练习打包\\test", "aaa");
boolean b = file.mkdir();
System.out.println("文件夹创建结果是:" + b);
// 文件夹创建结果是:true
}
}
创建多级文件夹
public boolean mkdirs()
————创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。
返回:当且仅当已创建目录以及所有必需的父目录时,返回 true;否则返回 false ;
这个方法也可以创建单级文件夹;
import java.io.File;
public class MyTest {
public static void main(String[] args) {
File file = new File("D:\\桌面图标\\文件程序练习打包\\test\\a1\\a2\\aaa");
// 创建多级文件夹
boolean b = file.mkdirs();
System.out.println("文件夹创建结果是:" + b);
// 文件夹创建结果是:true
File file1 = new File("D:\\桌面图标\\文件程序练习打包\\test\\bbb");
// 创建单级文件夹
boolean b1 = file1.mkdirs();
System.out.println(b1);//true
}
}
删除文件、文件夹
public boolean delete()
————删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。
返回:当且仅当成功删除文件或目录时,返回 true;否则返回 false ;
注意:删除不走回收站,因此一定要慎重!
import java.io.File;
public class MyTest {
public static void main(String[] args) {
File file = new File("a.txt");
boolean b = file.delete();
System.out.println("文件夹删除结果是:" + b);
// 文件夹删除结果是:true
File file1 = new File("b.txt");
//文件不存在
boolean b1 = file1.delete();
System.out.println(b1);//false
}
}
重命名/剪切文件
public boolean renameTo(File dest)
——重新命名此抽象路径名表示的文件;这个方法有两个功能:剪切、重命名;
- 如果给定的新文件名与原文件在同一路径下,就是重命名;
- 如果给定新文件名与原文件不在同一盘符下,就是剪切+重命名;
- 如果你只想要剪切,就可以使得新文件的名字与旧文件的名字相同;
重命名文件:
import java.io.File;
public class MyTest {
public static void main(String[] args) {
File file = new File("a.txt");
boolean b = file.renameTo(new File("b.txt"));
System.out.println("文件重命名结果是:" + b);
// 文件重命名结果是:true
}
}
剪切文件:
import java.io.File;
public class MyTest {
public static void main(String[] args) {
File file = new File("b.txt");
boolean b = file.renameTo(new File("aaa\\c.txt"));
System.out.println("文件剪切并重命名结果是:" + b);
// 文件剪切并重命名结果是:true
}
}
判断功能
public boolean isFile()
————测试此抽象路径名表示的文件是否是一个标准文件。返回:当且仅当此抽象路径名表示的文件存在且 是一个标准文件时,返回 true;否则返回 false ;
注意:如果文件不存在,它的返回结果是false;
public boolean isDirectory()
————测试此抽象路径名表示的文件是否是一个目录。 返回:当且仅当此抽象路径名表示的文件存在且 是一个目录时,返回 true;否则返回 false ;
public boolean exists()
————测试此抽象路径名表示的文件或目录是否存在;
public boolean canRead()
——测试应用程序是否可以读取此抽象路径名表示的文件;我们使用图形界面化或者createNewFile()创建一个文件默认为可读可写;
public boolean canWrite()
————测试应用程序是否可以修改此抽象路径名表示的文件;
public boolean isHidden()
————测试此抽象路径名指定的文件是否是一个隐藏文件。隐藏 的具体定义与系统有关;
在 UNIX 系统上,如果文件名以句点字符 (’.’) 开头,则认为该文件被隐藏;
在 Microsoft Windows 系统上,如果在文件系统中文件被标记为隐藏,则认为该文件被隐藏;
public boolean isAbsolute()
————测试此抽象路径名是否为绝对路径名;
绝对路径名的定义与系统有关;
在 UNIX 系统上,如果路径名的前缀是 “/”,那么该路径名是绝对路径名;
在 Microsoft Windows 系统上,如果路径名的前缀是后跟 “\” 的盘符,或者是 “\”,那么该路径名是绝对路径名;
import java.io.File;
public class MyTest {
public static void main(String[] args) {
File file = new File("a.txt");
File file1 = new File("D:\\桌面图标\\文件程序练习打包\\test\\a.txt");
boolean b = file.isAbsolute();
boolean b1 = file1.isAbsolute();
System.out.println(b);
//该文件使用了相对路径 false
System.out.println(b1);
//该文件使用了绝对路径 true
}
}
获取功能
public String getAbsolutePath() ———获取绝对路径
public String getPath() ———获取相对路径
public String getParent() ———返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null;
public File getParentFile()———返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null;
public long getTotalSpace() ———返回此抽象路径名指定的分区大小。 返回总容量 单位字节
public long getFreeSpace() ———返回此抽象路径名指定的分区中未分配的字节数。返回剩余容量 单位字节
public String getName() ———获取名称
public long length()———获取长度。字节数
public long lastModified()———获取最后一次的修改时间,毫秒值
代码示例:
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyTest {
public static void main(String[] args) {
File file = new File("a.txt");
File file1 = new File("D:\\桌面图标\\文件程序练习打包\\test\\a.txt");
String absolutePath = file.getAbsolutePath();
//获取绝对路径
System.out.println(absolutePath);
//E:\myJavaProject\文件学习\a.txt
String path = file1.getPath();
//获取相对路径
System.out.println(path);
//D:\桌面图标\文件程序练习打包\test\a.txt
String fileParent = file1.getParent();
//获取此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
System.out.println(fileParent);
//D:\桌面图标\文件程序练习打包\test
File parentFile = file.getParentFile();
// 获取此抽象路径名父目录的抽象路径文件;如果此路径名没有指定父目录,则返回 null。
System.out.println(parentFile);
//null
long totalSpace = new File("D://").getTotalSpace();
//返回此抽象路径名指定的分区大小。 返回总容量的单位是字节
System.out.println(totalSpace / 1024 / 1024 / 1024.0);
//57.9931640625
long freeSpace = new File("D://").getFreeSpace();
//返回此抽象路径名指定的分区中未分配的字节数。返回总容量的单位是字节
System.out.println(freeSpace / 1024 / 1024 / 1024.0);
//28.3251953125
String name = file.getName();
//获取名称
System.out.println(name);
//a.txt
long length = file.length();
//获取长度。字节数
System.out.println(length / 1024 / 1024 / 1024.0);
//0.0
long l = file.lastModified();
//获取最后一次的修改时间,毫秒值
Date date = new Date(l);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
//2020-05-25 10:37:32
}
}
获取文件列表
public String[] list()
——返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录;
import java.io.File;
public class MyTest {
public static void main(String[] args) {
File file = new File("D:\\桌面图标\\文件程序练习打包\\test");
String[] list = file.list();
for (String s : list) {
System.out.println(s);
}
/*1001533.jpg
111.docx
123.txt
a.txt
bbb
亲爱的旅人啊.mp3*/
}
}
public String[] list(FilenameFilter filter)
——返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录;
- 除了返回数组中的字符串必须满足过滤器外,此方法的行为与 list() 方法相同;
- 如果给定 filter 为 null,则接受所有名称;
- 否则,当且仅当在此抽象路径名及其表示的目录中的文件名或目录名上调用
- 过滤器的 FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 时,该名称才满足过滤器;
- FilenameFilter 是一个接口,它的作用是过滤,要想使用该接口,我们可以使用匿名内部类,并重写里面的accept()方法作为参数;
import java.io.File;
import java.io.FilenameFilter;
public class MyTest {
public static void main(String[] args) {
File file = new File("D:\\桌面图标\\文件程序练习打包\\test");
String[] list = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
/*dir - 被找到的文件所在的目录
name - 文件的名称*/
if (name.endsWith(".jpg")) {
return true;
} else {
return false;
}
}
});
for (String s : list) {
System.out.println(s);
}
/*1001533.jpg
1001572.jpg
1001645.jpg
1001677.jpg
1001741.jpg
1001819.jpg*/
}
}
public File[] listFiles()
——返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件;
这个方法与前面的方法唯一的区别就是它的返回值是File类型的数组,这样对于我们来说操作会更方便;
import java.io.File;
public class MyTest {
public static void main(String[] args) {
File file = new File("D:\\桌面图标\\文件程序练习打包\\test");
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f);
}
/*D:\桌面图标\文件程序练习打包\test\1001533.jpg
D:\桌面图标\文件程序练习打包\test\111.docx
D:\桌面图标\文件程序练习打包\test\123.txt
D:\桌面图标\文件程序练习打包\test\a.txt
D:\桌面图标\文件程序练习打包\test\bbb
D:\桌面图标\文件程序练习打包\test\亲爱的旅人啊.mp3*/
}
}
public File[] listFiles(FileFilter filter)
——返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
除了返回数组中的路径名必须满足过滤器外,此方法的行为与 listFiles() 方法相同;
如果给定 filter 为 null,则接受所有路径名;否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(java.io.File) 方法返回 true 时,该路径名才满足过滤器;
FileFilter接口和上面的FilenameFilter 一样,都是接口,我们要想使用他作为参数,采用匿名内部类并重写里面的accept();
import java.io.File;
import java.io.FileFilter;
public class MyTest {
public static void main(String[] args) {
File file = new File("D:\\桌面图标\\文件程序练习打包\\test");
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
String name = pathname.getName();
if(name.endsWith(".txt")){
return true;
}else{
return false;
}
}
});
for (File f : files) {
System.out.println(f);
}
/*D:\桌面图标\文件程序练习打包\test\123.txt
D:\桌面图标\文件程序练习打包\test\a.txt*/
}
}
public File[] listFiles(FilenameFilter filter)
——返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录;
这个方法里面需要的参数与之前的方法public String[] list(FilenameFilter filter)一样,这里不再赘述参数的使用;
import java.io.File;
import java.io.FilenameFilter;
public class MyTest {
public static void main(String[] args) {
File file = new File("D:\\桌面图标\\文件程序练习打包\\test");
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if (name.endsWith(".docx")) {
return true;
} else {
return false;
}
}
});
for (File f : files) {
System.out.println(f);
}
//D:\桌面图标\文件程序练习打包\test\111.docx
}
}
File类的练习
删除多级文件夹
现在给出一个文件夹,里面包含有多级的子文件夹,文件夹和子文件夹里面都包含文件,删除这个文件夹;
因为deltete()只能删除文件或者空文件夹,所以我们需要先删除文件,再删除套在文件外面的文件夹;
import java.io.File;
public class MyTest1 {
public static void main(String[] args) {
//封装目录
File file = new File("D:\\桌面图标\\文件程序练习打包\\test");
//抽取方法
delFiles(file);
System.out.println("删除完成!");
}
private static void delFiles(File file) {
File[] files = file.listFiles();
for (File f : files) {
if (f.isFile()) {
//如果这是一个文件,我们就删除
f.delete();
} else {
//如果这是一个文件夹,我们继续递归调用该方法,删除里面的文件
delFiles(f);
}
}
//最终删除该文件夹
file.delete();
}
}
删除多级文件夹下面的.jpg文件
给出一个文件夹,里面有些子文件夹,这个文件与他的子文件夹里面都有后缀名为.jpg的文件,我们现在把这些文件删除;
import java.io.File;
public class MyTest2 {
public static void main(String[] args) {
File file = new File("D:\\桌面图标\\文件程序练习打包\\demo");
delFiles(file);
System.out.println("删除完成!");
}
private static void delFiles(File file) {
File[] files = file.listFiles();
for (File f : files) {
if(f.isDirectory()){
delFiles(f);
}else if(f.getName().endsWith(".jpg")){
f.delete();
}
}
}
}