File类
-
java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录。File类只用于表示文件(目录)的信息(名称、大小等),不能对文件的内容进行访问。
-
xx.java 运行之前会先编译成xx.class,然后运行这个字节码文件
-
在IDEA中,编译后的字节码文件存放在同工程的out目录下
-
在Eclipse中,编译后的字节码文件存放在同工程的bin目录下
-
图片、文档、音乐等等文件素材,必须跟随字节码文件存在才有用
-
File:代表文件或目录
new File() 不代表 这个文件/目录 一定存在,仅代表Java中的一个对象
. :当前目录
… :上一级目录
构造方法
File(String pathname)
- 通过将给定路径名字符串转换成抽象路径名来创建一个新的File实例。
— 抽象路径应尽量使用相对路径,并且目录的层级分隔符不要直接写“/”或“\”,应使用File.separator这个常量表示,以避免不同系统带来的差异。
public static void main(String[] args) {
File file=new File("demo"+File.separator+"HelloWorld.txt");
System.out.println(file);//demo\HelloWorld.txt
}
File( parent, String child)
- 根据parent抽象路径名和child路径名字符串创建一个新的File实例
File parent=new File("demo");
File file1=new File(parent,"HelloWorld.txt"); System.out.println(file1);//demo\HelloWorld.txt
常用API
separator()
-
与系统相关的默认名称–分隔符字符,以方便的方式表示为字符串,该字符串包含一个字符——UNIX系统上
'/'
——Microsft Windows系统上是'\\'
-
目录的层级分隔符不要直接写“/”或“\”,应使用File.separator这个常量表示,以避免不同系统带来的差异。
isFile()
- 用于判断当前File对象所表示的是否是一个文件
- 返回值:boolean类型
isDirectory()
- 用于判断当前File对象所表示的是否是一个目录
- 返回值:boolean类型
creatNewFile()
- 用于当且仅当 不存在具有此抽象路径名指定的名称 的文件 时,创建由此抽象路径名指定的一个新的空文件
- 返回值:boolean类型-------创建成功则返回true,若指定的文件已存在返回false
mkdir()
- 用于创建此抽象路径名指定的目录
- 返回值:boolean类型-------当且仅当已创建目录时-true,否false
mkdirs()
- 用于创建此抽象路径名指定的目录,包括所有必须但不存在的父目录。
- 注意:此操作失败时也可能已经成功地创建了一部分必须的父目录
- 返回值:boolean类型----当且仅当已创建目录以及所有必须的父目录时,true,否则false
length()
- 返回此抽象路径名表示的文件的长度(占用的字节量)
- 返回值:long类型
exists()
- 用于测试此抽象路径名表示的文件或目录是否存在
- 返回值:boolean类型
delete()
- 用于删除此抽象路径名表示的文件或目录
- 返回值:boolean类型 ------成功删除文件/目录-true—否false
- 注意:若File对象所表示的是一个目录时,在删除时需要保证此为空目录才可以成功删除
getName()
- 返回由此抽象路径名表示的文件或目录的名称。 这只是路径名称序列中的最后一个名字。 如果路径名的名称序列为空,则返回空字符串。
- 返回值:String类型
getParent()
- 返回此抽象路径名的父
null
的路径名字符串,如果此路径名未命名为父目录,则返回null。 - 返回值:String类型
getParentFile()
- 返回此抽象路径名的父
null
抽象路径名,如果此路径名未命名为父目录,则返回null。 - 返回值:File类型
getPath()
- 将此抽象路径名转换为路径名字符串。
isAbsolute()
- 测试这个抽象路径名是否是绝对的。
- 返回值:boolean类型
- 绝对路径名的定义是依赖于系统的。 在UNIX系统上,如果前缀为
"/"
,则路径名是绝对的。 在Microsoft Windows系统上,路径名是绝对的,如果其前缀是驱动器说明符,后跟"\\"
,或者前缀为"\\\\"
。
lastModified()
- 返回此抽象路径名表示的文件上次修改的时间。
- 返回值:long类型
list()
- 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录
- 返回值:String[]
- 如果此抽象路径名不表示目录,则此方法返回
null
。 否则返回一个字符串数组,一个用于目录中的每个文件或目录。 表示目录本身和目录的父目录的名称不包括在结果中。 每个字符串都是一个文件名,而不是完整的路径。
listFiles()
- 用于返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的子项(文件或目录)
- 返回值:抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。
- 如果目录为空,那么数组也将为空。如果抽象路径名不表示一个目录,或者发生I/O错误,则返回null。
public static void main(String[] args) {
//list---返回的是字符串
//listFiles---返回的是File对象
//如果File是目录,可以将File目录中的所有文件/目录 都列出来
//. 当前目录 JavaSE
File file=new File(".");
File[]listFile=file.listFiles();
for(File f:listFile){
System.out.println(f);
/**
.\.idea
.\a.txt
.\out
.\src
.\string.iml
.\text*/
}
System.out.println("---------分割线————————————");
/** String ss[] = list();
if (ss == null) return null;
ArrayList<File> files = new ArrayList<>();
for (String s : ss)
if ((filter == null) || filter.accept(this, s))//---->返回的是true,就执行一下程序,既保留
files.add(new File(s, this));
return files.toArray(new File[files.size()]);
*
*/
//匿名内部类,相当于实现了FileFilter接口
File[]fs=file.listFiles(new FileFilter() {
//filter.accept(f)=true 才要保留f对象
@Override
/**
* 返回true,保留f对象
* 返回false,过滤掉f对象
* 保留所有的目录,过滤掉文件,返回f.isDirectory()
* 只保留大小在1000b以上的,返回f.length()>1000
* 只保留java文件,返回f.getName.endWith(".java")
*/
public boolean accept(File f) {
return f.getName().endsWith(".java");
//false 是空
//true时
/**
* .\.idea
* .\a.txt
* .\out
* .\src
* .\string.iml
* .\text
*/
//f.isDirectory()
/**
* .\.idea
* .\out
* .\src
* .\text
*/
//f.length()>1000 空
//f.getName.endWith(".java") 空
}
});
for(File f:fs){
System.out.println(f);
}
}
}
创建File对象
public static void main(String[] args) throws IOException {
// 绝对路径——从盘符开始的完整路径
//相对路径——需要一个参考值,所以不固定[不够准确,但是也常用]
//最常用的是通过相对路径获得绝对路径
//a.text存不存在,不影响file对象的创建
File file=new File("a.txt");
//获得文件的绝对路径
String path=file.getAbsolutePath();
System.out.println(path);//F:\java练习程序\string\a.txt
//可以询问文件是否存在
System.out.println(file.exists());//false----true
//如果存在,删除该目录
//file.delete();
//创建一个文件-a.text-----执行这一步之后,文件存在--true
//[前提,文件不存在时才会创建]
//如果有一个文件也叫a.txt,那它是目录——不能创建同名的文件
//如果 File file=new File("a","a.txt");--a是父路径,a.txt是子路径—不能创建文件
//file.createNewFile();
//如果不存在,可以创建目录
//file.mkdir();
//询问file对象是不是普通文件--/目录
System.out.println(file.isFile());//true
System.out.println(file.isDirectory());//false
//查看文件的大小
System.out.println(file.length());//0
//查看文件最后的修改时间--long类型的值
System.out.println(file.lastModified());//1615986242616
//获得file对象的名字
System.out.println(file.getName());//a.txt
}
}
File file=new File("text");
file.delete();
//当我创建text目录后,里面又创建了子目录,子目录里创建文件···
//结果:目录没有删除
//说明:只能删除普通文件/空目录。
FileFilter接口
-
FileFilter用于抽象路径名的过滤器
-
此接口的实例可传给File类的listFiles(FileFilter)方法。用于返回满足该过滤器要求的子项。
— File[] listFiles(FileFilter filter)
- 代码块看listFiles上的
递归删除文件
- 递归:自己调用自己的方法
- 递归的核心问题:避免死循环,有一个结束的开关/标志
/**
* 要求用户输入一个文件或目录名,并删除当前目录下的该文件或目录。
* 可自行手动先在当前项目目录中创建一个要删除的文件或目录,若是目录,还可以
* 在该目录中继续创建若干级目录和文件。
*/
public class Test04 {
public static void deleteFile(File file){
//是目录,删除当前目录下的该文件或目录
if(file.isDirectory()){
File[]listFile=file.listFiles();
for(File f:listFile){
deleteFile(f);//递归删除
}
}
file.delete();
}
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
System.out.println("请输入一个文件或目录名:");
String str=scan.nextLine();
File file=new File(str);
//文件或目录不存在时
if(!file.exists()){
//自行手动 先在当前项目目录中 创建一个要删除的目录
file=new File(".");
//继续创建若干级目录和文件
File[]listFile=file.listFiles();
for(File f:listFile){
//删除目录下的文件和目录
deleteFile(f);
}
file.delete();
}else{
deleteFile(file);
}
}
}