Java基础:IO流之File

File对象

简介

File 对象是文件和目录路径名的抽象表示形式。

构造方法摘要

1
2
3
File(File parent, String child)     //根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 
File(String pathname) //通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File(String parent, String child) //根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
1
2
3
4
5
6
7
8
9
10
//File(File parent, String child)  演示
File parent = new File("D:\\java");
File file = new File(parent, "hello.java");

//File(String pathname) //演示
File file = new File("D:\\java\\hello.java");
File dir = new File("D:\\java");

//File(String parent, String child) 演示
File file = new File("D:\\java", "hello.java");

文件或者文件夹都可以被封装成文件对象。

方法摘要

创建

1
2
3
boolean createNewFile() //在指定位置创建文件,如果文件已存在,则不创建,返回false
boolean mkdir() //创建文件夹,只能创建一层目录
boolean mkdirs() //创建文件夹,可以创建多级目录

删除

1
2
3
4
//如果此路径名表示一个目录,则该目录必须为空才能删除。 

boolean delete() //删除失败返回false。如若文件正在被占用,则删除不了会返回 false,
void deleteOnExit() //在虚拟机退出时删除文件。

判断

1
2
3
4
5
boolean exists()    //文件是否存在
boolean isFile() //是否是一个文件
boolean isDirectory //是否是一个文件夹
boolean isHidden() //是否是一个隐藏文件
boolean isAbsolute()//判断是否是一个绝对路径

注意:对文件对象进行判断操作时,除了 isAbsolute 方法,其他都需先判断文件是否存在,如文件不存在一律返回 false

获取信息

1
2
3
4
5
6
7
String getName()            //获取文件名称
String getPath() //获取文件的路径,创建对象是填的路径是什么就返回什么
String getParent() //获取父路径 返回的是创建对象时填写路径的父路径
String getAbsolutePath() //返回文件的绝对路径
File getAbsoluteFile() //返回文件的绝对路径的对象表现形式
long lastModified() //返回文件的最后修改时间,如文件不存在,则返回0
long length() //返回文件的大小,单位:字节数,如是一个文件夹,则返回 0

对于 getParent 方法,如果创建对象时写的是 F:\\java\hello.java,则返回值为 "java",如果创建对象时写的是相对路径 hello.java,则返回 null

其他操作

1
2
3
4
5
6
7
8
9
10
boolean renameTo(File dest) //重名名一个文件或文件夹,也可以当做剪贴功能来看

static File[] listRoots(); //列出可用的文件系统根。 在 Windows 环境下即为盘符
String[] list() //返回一个字符串数组,数组中存放了指定目录下的所有子文件及文件夹,
//包括隐藏文件,如果该目录不存在或者是一个文件,那么会返回 null
File[] listFiles() //与上方的 list 方法功能类似,这里返回的是文件对象

String[] list(FilenameFilter filter) //返回文件夹下过滤后的文件名称
File[] listFiles(FilenameFilter filter) //返回文件夹下过滤后的文件对象
File[] listFiles(FileFilter filter) //返回文件夹下过滤后的文件对象

方法演示

FilenameFilter

获取一个文件夹下所有的后缀名为 .java 的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.File;
import java.io.FilenameFilter;

class MyFilenameFilter implements FilenameFilter {

@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
}

public class FilenameFilterDemo {
public static void main(String[] args) {
File file = new File("F:\\java");

String[] names = file.list(new MyFilenameFilter());

for (String name : names) {
System.out.println(name);
}
}
}

FileFilter

获取一个文件夹下所有的大小大于 1024 个字节的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.File;
import java.io.FileFilter;

class MyFileFilter implements FileFilter {

@Override
public boolean accept(File pathname) {
return pathname.length() > 1024;
}

}

public class FileFilterDemo {
public static void main(String[] args) {
File file = new File("F:\\java");

File[] files = file.listFiles(new MyFileFilter());

for (File f : files) {
System.out.println(f.getName());
}
}
}

递归获取文件目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.io.File;

public class GetFilesDemo {


public static void main(String[] args) {
getFile(new File("E:\\hexo\\public"), 0);
}

public static void getFile (File file, int i) {
if (!file.exists())
return;

File[] files = file.listFiles();

String str = "";
for (int x = 0; x < i; x++) {
str+="\t";
}
for (File f : files) {
if (f.isDirectory()) {
System.err.println(str + f.getName());
getFile(f, i+1);

}
if (f.isFile()) {
System.out.println(str + f.getName());
}
}

}
}

上述代码中为了以便区分,文件夹使用的是红色的错误输出颜色,文件使用的是普通颜色。

删除带有文件的文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.File;

public class DeleteFilesDemo {
public static void main(String[] args) {
deleteAll(new File("E:\\java"));
}
public static void deleteAll (File file) {
if (!file.exists())
return;

File[] files = file.listFiles();

for (File f : files) {
if (f.isDirectory()) {
deleteAll(f);
}
if (f.isFile()) {
if (!f.delete())
System.out.println(f.getAbsolutePath() + "正在被占用,无法删除");
}
}

if (!file.delete())
System.out.println(file.getAbsolutePath() + "正在被占用,无法删除");
}
}

File 默认的 delete 方法无法删除非空的文件夹,所以这里要先将要被删除的文件夹以及其字文件夹和文件先删除,再删除其要删除的文件夹即可。

但要注意的是,如果文件正在被占用的话,是无法删除的。