一、File
File类概述
File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)
使用File可以做到:
1:访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等
2:创建和删除文件或目录
3:访问一个目录中的子项
获取文件及其属性
length(): 返回文件的长度, 单位是字节数(如果File是目录, 则返回0)
exists(): 判断当前文件或目录是否存在,存在则返回true
isFile(): 判断当前file是否为文件,是文件则返回true
isDirectory(): 判断当前file是否为目录,是目录返回true
getName(): 获取当前File文件或目录的名字
getParent(): 获取当前File父目录的路径
getAbsolutePath(): 获取当前File文件或目录的完整路径
代码案例
package file;
import java.io.File;
/**
* 该案例测试File类
*/
public class FileDemo {
public static void main(String[] args) {
//访问当前项目中的demo.txt文件
/*
使用File的构造方法创建对象,参数是引入文件的路径
1.绝对路径:从盘符开始,到文本名为止的路径 一般不会使用这个路径的,因为跨平台性太差
D:\Dates\IDEASPACE\CGBVN2112JAVASE\demo.txt
2.相对路径:则是相对当前项目而言
./ 表示当前目录,也可以省略
*/
//new File("D:/Dates/IDEASPACE/CGBVN2112JAVASE/demo.txt");
File file = new File("./DAY02/demo.txt");
//获取当前文件的名字
System.out.println(file.getName());
//获取当前文件是否是一个文件
System.out.println(file.isFile());
//获取当前文件的大小 单位是字节
System.out.println(file.length());//35
//获取当前文件是否可读
System.out.println(file.canRead());
//获取当前文件是否可写
System.out.println(file.canWrite());
//获取当前文件是否隐藏
System.out.println(file.isHidden());
}
}
创建文件
createNewFile(): 创建指定路径和名称的文件, 如果文件不存在, 则创建并返回true, 否则就不创建并返回false
代码案例
package file;
import java.io.File;
import java.io.IOException;
/**
* 测试创建指定的路径或文件
*/
public class CreateFileDemo {
public static void main(String[] args) throws IOException {
//在当前的项目目录下,创建一个test.txt文件
//1.先将文件的路径封存到File对象中
File file = new File("./test.txt");
//2.如果文件不存在,就创建改文件
if(file.exists()){//exists 判断当前的文件是否存在,如果存在返回true,否则返回false
System.out.println("当前文件已经存在了");
}else{
//创建改文件
file.createNewFile();//create 创建 new 新的 file 文件
System.out.println("文件创建成功");
}
}
}
删除文件
delete(): 删除文件或删除空目录, 删除成功返回true(非空目录删除会失败)
代码案例
package file;
import java.io.File;
/**
* 测试删除指定文件
*/
public class DeleteFileDemo {
//shift+enter 可以快速将光标跳转到下一行
// crtl+/ 生成单行注释
/* ctrl+shift+/ */
public static void main(String[] args) {
//删除test.txt文件
File file = new File("./test.txt");
if(file.exists()){
file.delete();//删除文件 此处的删除是真的删除了
System.out.println("文件已经删除");
}else{
System.out.println("文件不存在");
}
}
}
创建目录
mkdir(): 创建指定路径和名称的目录, 如果目录不存在, 则创建并返回true, 否则就不创建并返回false
mkdirs(): 创建指定路径和名称的多级目录, 如果目录不存在, 则创建并返回true, 否则就不创建并返回false
代码案例
package file;
import java.io.File;
import java.io.IOException;
/**
* 测试创建指定的路径的目录
*/
public class MKDirDemo {
public static void main(String[] args) {
//当前目录下新建一个目录:test 目录是没有后缀的
//File file = new File("./test");
File file = new File("./a/b/c/d/e/f/g/h");
if(file.exists()){//判断当前目录是否存在
System.out.println("目录已存在");
}else{
/*
mkdir 创建单个目录
mkdirs 创建嵌套目录
*/
file.mkdirs();
System.out.println("目录已创建");
}
}
}
删除目录
delete(): 删除文件或删除空目录, 删除成功返回true(非空目录删除会失败)
代码案例
package file;
import java.io.File;
/**
* 测试删除指定目录
*/
public class DeleteDirDemo {
public static void main(String[] args) {
//删除test目录
File file = new File("./test");
//删除目录,该目录必须是一个空目录,如果该目录下有文件或者目录,都不能删除
//File file = new File("./a");
if(file.exists()){
file.delete();//删除目录 此处的删除是真的删除了
System.out.println("目录已经删除");
}else{
System.out.println("目录不存在");
}
}
}
获取目录中的子项
代码案例
package file;
import java.io.File;
import java.util.Arrays;
/**
* 获取一个目录中的子项
*/
public class ListFilesDemo {
public static void main(String[] args) {
//获取当前项目的所有的子项
File dir = new File(".");
/*
boolean isFile()
判断当前的File表示的是否是一个文件
boolean isDirectory()
判断当前的File表示的是否是一个目录
*/
if(dir.isDirectory()){//只有当是目录时,才可以获取子项
//listFiles 返回的是一个装有File类型的数组
//只能获取目录下的一级目录内容
File[] files = dir.listFiles();
System.out.println(
dir.getAbsolutePath()+"有"+files.length+"子项");
for(int i=0 ; i<files.length; i++){
System.out.println(files[i]);
}
}
}
}
递归遍历目录
递归(recursion)是一种常见的解决问题的方法,即把问题逐渐简单化。
递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
m();
...
public void m(){
...
m();
...
}
需要注意的是: 递归方法一定要有出口, 否则将会一直自己调用自己, 变成死循环, 严重时将会导致内存溢出!
需求: 遍历指定File(目录)下的所有子目录和子文件, 输出该目录下的所有目录和文件名
思路: 声明一个diGui目录的方法, 接收一个File类型的对象, 方法内部实现如下:
1.判断当前File是否为文件(防止第一次传入的是文件)
1.1.如果file是文件, 输出: "文件不支持递归!"
1.2.如果file是目录, 则继续执行第2步
2.获取当前目录下的所有子目录及子文件对象组成的File数组
3.遍历当前目录下的所有子目录及子文件对象
4.判断当前遍历的是目录还是文件
4.1.如果当前遍历的是文件, 输出该文件的路径+名称
4.2.如果当前遍历的是目录, 输出当前目录的路径+名称
并以此目录作为根, 接着遍历该目录下的所有子目录和子文件, 输出该目录下的所有目录和文件名
统计一个目录下所有文件的大小之和
代码案例
package file;
import java.io.File;
import java.util.Arrays;
/**
* 递归查询目录的所有子项
*/
public class ListDirDGDemo {
public static void main(String[] args) {
//指定递归的目录
File file = new File("./a");
//调用一个递归的方法,递归上面的file对象
diGuiFolder(file);
//通过该方法,可以获取指定目录的子文件的总和大小
long size = diGuiSumFolder(file);
System.out.println("文件总大小:"+size+"字节");
}
private static long diGuiSumFolder(File file) {
//0.声明一个变量,用于记录累加的文件大小
long total = 0;
//1.判断当前File是否为文件(防止第一次传入的是文件)
if (file.isFile()){
//1.1.如果file是文件, 输出: "文件不支持递归!"
System.out.println("文件不支持递归");
return file.length();
}else {
//1.2.如果file是目录, 则继续执行第2步
//2.获取当前目录下的所有子目录及子文件对象组成的File数组
File[] files = file.listFiles();
//3.遍历当前目录下的所有子目录及子文件对象
for (int i = 0; i < files.length; i++) {
//4.判断当前遍历的是目录还是文件
if(files[i].isFile()){
//4.1.如果当前遍历的是文件, 计算该文件的大小
total += files[i].length();
}else{
//4.2.如果当前遍历的是目录, 输出当前目录的名称
System.out.println("目录名:"+files[i]);
//并以此目录作为根,接着遍历该目录下的所有子目录和子文件,
//调用当前递归方法,然后回去目录下子文件的大小,累加到total变量上
total += diGuiSumFolder(files[i]);
}
}
}
return total;
}
private static void diGuiFolder(File file) {
//1.判断当前File是否为文件(防止第一次传入的是文件)
if (file.isFile()){
//1.1.如果file是文件, 输出: "文件不支持递归!"
System.out.println("文件不支持递归");
return;
}else {
//1.2.如果file是目录, 则继续执行第2步
//2.获取当前目录下的所有子目录及子文件对象组成的File数组
File[] files = file.listFiles();
//3.遍历当前目录下的所有子目录及子文件对象
for (int i = 0; i < files.length; i++) {
//4.判断当前遍历的是目录还是文件
if(files[i].isFile()){
//4.1.如果当前遍历的是文件, 输出该文件的名称
System.out.println("文件名:"+files[i]);
}else{
//4.2.如果当前遍历的是目录, 输出当前目录的名称
System.out.println("目录名:"+files[i]);
//并以此目录作为根,接着遍历该目录下的所有子目录和子文件,
//输出该目录下的所有目录和文件名
diGuiFolder(files[i]);
}
}
}
}
}
递归删除目录
代码案例
package file;
import java.io.File;
/**
* 递归删除目录
*/
public class DeleteDirDGDemo {
public static void main(String[] args) {
File file = new File("./a");
//递归删除目录的方法
diGuiDeleteFolder(file);
}
private static void diGuiDeleteFolder(File file) {
//1.判断当前File是否为文件(防止第一次传入的是文件)
if (file.isFile()){
//1.1.如果file是文件, 输出: "文件不支持递归!"
System.out.println("文件不支持递归");
return;
}else {
//1.2.如果file是目录, 则继续执行第2步
//2.获取当前目录下的所有子目录及子文件对象组成的File数组
File[] files = file.listFiles();
//3.遍历当前目录下的所有子目录及子文件对象
for (int i = 0; i < files.length; i++) {
//4.判断当前遍历的是目录还是文件
if(files[i].isFile()){
//4.1.如果当前遍历的是文件, 输出该文件的名称
System.out.println(
"成功的删除了["+file.getName()+
"]目录下的"+files[i]);
//执行删除
files[i].delete();
}else{
//并以此目录作为根,接着遍历该目录下的所有子目录和子文件
diGuiDeleteFolder(files[i]);
}
}
}
//删除file目录
file.delete();
System.out.println("成功删除["+file.getName()+"]目录");
}
}
获取一个目录中符合过滤条件的所有子项
代码案例
package file;
import java.io.File;
import java.io.FileFilter;
/**
* 获取一个目录中符合过滤条件的所有子项
* 重载的listFiles方法
* File[] listFiles(FileFilter filter)
* 该方法要求传入一个文件过滤器,然后将仅满足过滤器要求的子项进行返回
*/
public class ListFilesDemo2 {
public static void main(String[] args) {
File file = new File(".");
/*
java语法要求:接口不能被直接实例化,想要创建接口对象,只能
创建一个新的类,实现该接口,创建子类实例
匿名内部类,省略中间创建的子类的过程
1.省略子类类名
2.new 接口名(){
实现接口中未实现的方法
};
*/
FileFilter filter = new FileFilter() {
//在accept方法中书写,过滤的规则
@Override
public boolean accept(File pathname) {
//过滤文件名中包含o的文件
String name = pathname.getName();
System.out.println("正在过滤的元素:"+name);
//包含返回true,否则false
return name.contains("o");
}
};
//如果过滤器中过滤的元素返回的是true,就添加到files数组中,否则就不添加到数组中
File[] files = file.listFiles(filter);
for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
}
}