设置工作目录:
后点击Edit Configuration
Working directory:就是当前工作目录,我们可以对其进行修改,可以改成$MODULE_WORKING_DIR,表示改到当前目录。
为什么学习File类?
因为操作系统中,所有需要永久保存的数据,都是以文件的形式存在。
File类概述:文件和目录 路径名 的 抽象表达形式
注意:抽象 和 物理存在相对
File类对象表示的就等价于一个 路径名 所表示的文件或者目录
路径:
- 绝对路径名是完整的路径名,不需要任何其他信息就可以定位它所表示的 文件或目录。如:windows:E:\first\a.txt
- 相反,相对路径名必须使用取自其他路径名的信息进行解释(相对路径本身表示信息不完整)。如:windows: dir\a.txt
3. 默认情况下,java.io包中的类总是根据当前用户目录来解析相对路径名。
此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。如:E:\wangdao\22th\file\ + dir\a.txt
路径表示:
1.对于 UNIX 平台,绝对路径名的前缀始终是 “/”。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 “/” 且名称序列为空。所有的文件都或直接或间接的存在于根目录下,和Windows中的C盘、D盘不一样
绝对路径表示: /data/a.log
相对路径:home/6379.conf
/: 表示根目录
2.对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 “:” 组成。如果路径名是绝对路径名,还可能后跟 “\”,而相对路径没有盘符前缀
绝对路径: E:\first\dir\a.txt
相对路径: 没有盘符前缀的路径 dir\a.txt
- File的构造方法:
File (String pathname) //以一个路径名字符串,创建File对象,该File对象就表示该路径名字符串路径,所表示的操作系统的目录或文件
File (String parent, Sting child) //是以相对路径的形式,创建File对象
File (File parent, String child)
····················································································································································································································
创建功能
public boolean createNewFile() //物理创建文件(并不能创建目录)
创建目录
public boolean mkdir()
public boolean mkdirs()
mkdir 和 mkdirs创建目录的区别:
- mkdir仅能在已经存在的目录下,创建新的目录
- mkdirs 当要创建的目标目录,如果目标目录的父目录不存在的时候,它会将不存在的目标目录的父目录,连同目标目录一起,都创建好
删除功能
public boolean delete() 删除文件
如果此路径名表示一个文件,则直接删除即可。
如果此路径名表示一个目录,则该目录必须为空才能删除。
重命名功能
public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
import java.io.File;
public class Demo04Rename {
public static void main(String[] args) {
File file = new File("e:\\first\\a.txt");
// 重命名 e:\first\b.txt
// 当目标File对象所表示抽象路径如果和原文件,的路径在同一目录下,该方法实现的效果仅仅只是重命名
boolean b = file.renameTo(new File("e:\\first\\b.txt"));
// 当目标File对象所表示抽象路径如果和原文件,的路径不在同一目录下,该方法实现的效果 文件移动 + 重命名
b = file.renameTo(new File("e:\\second\\bbbbbb.txt"));
System.out.println(b);
}
}
····················································································································································································································
判断功能
- public boolean isFile() //判断file对象表示的是否是一个文件
- public boolean isDirectory() //判断file对象表示的是否是一个目录
File对象既可以是一个目录,也可是一个文件 - public boolean exists() // 判断,file对象所表示的文件或目录是否物理存在
- public boolean canRead() // 判断,该file对象所表示的文件目录是否有读取权
- public boolean canWrite()
- public boolean isHidden() //判断目标文件是否是隐藏文件
基本获取
- public File **getAbsoluteFile() **//获取一个用绝对路径表示抽象路径名的File对象
- public String getAbsolutePath()//获取一个用绝对路径(相比起getAbsoluteFile一般用getAbsolutePath)
- public String getPath()
//在用相对路径名表示的File对象上调用其getPath()方法得到的是相对路径
//在用绝对路径名表示的File对象上调用其getPath()方法得到的是绝对路径 - public String getName()
- public long length()
- public long lastModified()
····················································································································································································································
高级获取功能:
-
public String[] list() 仅返回当前目录下的子文件或子目录的名称
1.返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的 文件 和 目录 (其实返回的就是当前目录下的所有目录或文件的名字)。
2.如果此抽象路径名不表示一个目录,那么此方法将返回 null -
public File[] listFiles() 仅返回当前目录下的子文件或子目录的名称
//返回的是File[],相比较String[],返回的内容会更全面,所以开发中常用listFiles()
- 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
- 如果此抽象路径名不表示一个目录,那么此方法将返回 null。如果目录为空,会返回一个空数组:[ ]。
自定义获取功能
- File[] listFiles(FileFilter filter)
- FileFilter:表示过滤器的接口
public interface FileFilter {
// 判断,参数File对象所表示的目录或者文件,是否满足过滤条件
boolean accept(File pathname);
}
一个FileFilter对象,表示一种具体的过滤条件
当我只想要得到,表示当前目录下,满足特殊条件的文件或者目录对应的File对象。如果我只想的到,.txt文件对应的File对象
public class Demo08HighBasic02 {
public static void main(String[] args) {
// E:\\dir\\log.txt
// 用匿名内部类对象,表示一个FileFilter子类对象
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File file) {
String name = file.getName();
boolean isTxt = name.endsWith(".txt");
return file.isFile() && isTxt;
}
};
File dir = new File("e:\\dir");
File[] files = dir.listFiles(filter);
System.out.println(Arrays.toString(files));
}
}
····················································································································································································································
作业:
- 递归删除目录 (相当于数的后序遍历,先删除孩子结点,再删除父节点)
package com.cskaoyan;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Arrays;
/**
* @author shihao
* @create 2020-04-26 11:08
*/
public class Homework01 {
public static void main(String[] args) throws IOException {
//创建目录
create();
//查找txt文件
File file = new File("F:\\dir");
findTxt(file);
//删除目录及目录里的文件
deleteAll(file);
}
private static void create() throws IOException {
File file = new File("F:\\dir");
if (!file.exists()) {
file.mkdir();
}
//在dir下创建第一层目录
for (int i = 1; i <= 4; i++) {
String path = file.getAbsolutePath() + "\\file" + i;
File f = new File(path);
if (!f.exists()) {
f.mkdir();
}
}
File file1 = new File("F:\\dir\\my.txt");
file1.createNewFile();
//创建第二层目录
for (int i = 1; i <= 4; i++) {
File f = new File("F:\\dir\\file" + i + "\\floor2\\floor3");
if (!f.exists()) {
f.mkdirs();
}
}
file1 = new File("F:\\dir\\file1\\floor2\\my1.txt");
if (!file1.exists()) {
file1.createNewFile();
}
file1 = new File("F:\\dir\\file3\\floor2\\my3.txt");
if (!file1.exists()) {
file1.createNewFile();
}
file1 = new File("F:\\dir\\file4\\floor2\\floor3\\my4.txt");
if (!file1.exists()) {
file1.createNewFile();
}
}
//查找txt文件
public static void findTxt(File file) {
FileFilter fileFilter = new FileFilter() {
@Override
public boolean accept(File file) {
String pathname = file.getName();
if (pathname.endsWith(".txt") && file.isFile()) {
return true;
}
return false;
}
};
File[] files = file.listFiles(fileFilter);
System.out.println(Arrays.toString(files));
}
//删除目录及目录里的文件
public static void deleteAll(File file) {
//获取当前目录下的所有文件或目录
File[] files = file.listFiles();
//当file不是目录(是文件)或files是空目录时
//if (files == null || files.length == 0)
if (file.isFile() || files.length == 0) {
file.delete();
return;
}
//递归删除当前目录下的所有文件或目录
for (int i = 0; i < files.length; i++) {
deleteAll(files[i]);
}
//递归删除完file目录下的文件或目录后,file已经成为空目录,可以直接删除
file.delete();
}
}