一、简介
File表示的是文件或目录。通过File对象可以获取文件信息, 创建或删除文件。
二、File方法简介
1.构造方法
通常情况下使用File(String pathname)
方法创建一个File对象。
pathname可以使用绝对路径或相对路径。在windows平台下, 如果路径名的开头是盘符(如C:\Program Files\xxx), 则说明是绝对路径; 在Linux系统下, 如果路径名的开头是"/", 则表明是绝对路径。
2.文件名相关
public static void filenameRelevant(File file) {
System.out.println(
"getname(): " + file.getName() +
"\n getPath(): " + file.getPath() +
"\n getAbsoluteFile(): " + file.getAbsoluteFile() +
"\n getAbsolutePath(): " + file.getAbsolutePath() +
"\n getParent(): " + file.getParent()
);
}
测试的文件——
private static String dirname = "G:\\github-project\\learning_ssm_helloWorld\\" +
"src\\main\\java\\test\\IO\\File";
private static String filename = dirname + "\\" +"FileTest.java";
以绝对路径为参数——
public static void main(String[] args) {
File file = new File(filename);
filenameRelevant(file);
}
// 输出:
getname(): FileTest.java
getPath(): G:\github-project\learning_ssm_helloWorld\src\main\java\test\IO\File\FileTest.java
getAbsoluteFile(): G:\github-project\learning_ssm_helloWorld\src\main\java\test\IO\File\FileTest.java
getAbsolutePath(): G:\github-project\learning_ssm_helloWorld\src\main\java\test\IO\File\FileTest.java
getParent(): G:\github-project\learning_ssm_helloWorld\src\main\java\test\IO\File
getName():对于文件来说, 是获取文件名;对于目录来说,是获取最后一级目录的名称。
getPath(): 通常情况下就是构造方法File(String pathname)
的参数 pathname
getAbsoluteFile() & getAbsolutePath(): 返回的内容是相同的, 只不过类型不同。
以相对路径为参数——
File dir = new File(".");
File file = new File(dir, "src\\main\\java\\test\\IO\\FileTest.java");
filenameRelevant(file);
// 输出
getname(): FileTest.java
getPath(): .\src\main\java\test\IO\FileTest.java
getAbsoluteFile(): G:\github-project\learning_ssm_helloWorld\.\src\main\java\test\IO\FileTest.java
getAbsolutePath(): G:\github-project\learning_ssm_helloWorld\.\src\main\java\test\IO\FileTest.java
getParent(): .\src\main\java\test\IO
getPath()和getParent() 的表示形式发生了变化, 以相对路径的形式。
在默认情况下, 系统使用工作路径来表示相对路径, 该路径由系统属性user.dir指定。File dir = new File(".");
中的参数 . 表示工作目录。
3.文件属性相关
通过以下文件为例子,调用方法获取其信息:
对于txt文件,设置为只读
System.out.println(
"\n exists(): " + file.exists() +
"\n canWrite(): " + file.canWrite() +
"\n canRead(): " + file.canRead() +
"\n isFile(): " + file.isFile() +
"\n isDirectory(): " + file.isDirectory() +
"\n isAbsolute() : " + file.isAbsolute() +
"\n lastModified(): " + file.lastModified() +
"\n length(): " + file.length()
);
}
public static void main(String[] args) {
File file = new File(filename);
fileInfo(file);
}
// 输出:
exists(): true
canWrite(): false
canRead(): true
isFile(): true
isDirectory(): false
isAbsolute() : true
lastModified(): 1571106113650
length(): 0
4.文件操作相关
public static void fileOpra(File file) throws IOException {
// 创建新文件
file.createNewFile();
// 尝试删除文件
if (file.delete()) {
System.out.println("Detele file success");
}
// 创建临时文件, 不指定文件夹
File tmp = file.createTempFile("mytemp", null);
System.out.println(tmp.getAbsolutePath());
// 创建临时文件, 指定文件夹
File tmpTwo = file.createTempFile("mytemp", null, new File("F:\\FileTest"));
System.out.println(tmpTwo.getAbsolutePath());
tmp.deleteOnExit();
tmpTwo.deleteOnExit();
}
public static void main(String[] args) throws IOException {
File file = new File("F:\\FileTest\\mymyfile.txt");
fileOpra(file);
}
// 输出:
Detele file success
C:\Users\PETER1~1\AppData\Local\Temp\mytemp7495322822071496782.tmp
F:\FileTest\mytemp3125230796879423183.tmp
关于delete方法, 若File代表的是文件夹, 且有子目录, 不能通过删除父目录达到删除整个目录的目的。
目录结构: F:\FileTest\我的文件夹\新建文件夹2
public static void main(String[] args) throws IOException {
// 创建表示父目录的File对象
File dirs = new File("F:\\FileTest\\我的文件夹");
if (!dirs.delete()) {
System.out.println("Detele file fail.");
}
}
输出:
Detele file fail.
代码修改后:
// 删除目录下的文件
public static boolean deleteSubfile(File dir) {
boolean del = true;
// 列出该文件夹下的子文件
File[] files = dir.listFiles();
for (File file : files) {
// 若是一个目录
if (file.isDirectory()) {
// 存在子文件
if (file.listFiles().length != 0) {
deleteSubfile(file);
}
}
// 删除文件
del = file.delete();
}
return del;
}
public static void main(String[] args) throws IOException {
// 创建表示父目录的File对象
File file = new File("F:\\FileTest\\我的文件夹");
// 若File对象表示目录, 删除目录下文件
if(file.isDirectory()){
deleteSubfile(file);
}
file.delete();
if (file.exists()) {
System.out.println("Detele file fail.");
}
}
5.目录操作相关
(1) 创建目录
// 创建文件夹
public static void createDir(File dir) {
// 创建单个目录
if (dir.mkdir()) {
System.out.println("create single dir success." + "\n");
} else {
// 创建多层目录
if (dir.mkdirs()) {
System.out.println("create dirs success." + "\n");
}
}
}
public static void main(String[] args) throws IOException {
File dir = new File("F:\\FileTest\\新建文件夹1\\新建文件夹2");
createDir(dir);
}
// 输出:
create dirs success.
测试目录 F:\FileTest
mkdir() 与 mkdirs() 的区别在于: 当使用mkdirs()时, 若父目录不存在则会创建父目录。
—mkdir() 只能在已存在的目录下创建单个目录。
—mkdirs() 该方法适于创建多层目录时使用。
(2) 列出指定目录下文件
// 列出目录下文件
public static void listDirfiles(File dir) {
// 列出该目录下文件名
String[] files = dir.list();
System.out.println(Arrays.toString(files) + "\n");
// 列出该目录下File对象
File[] filesF = dir.listFiles();
for (File file : filesF) {
System.out.println(file.getName());
}
}
public static void main(String[] args) throws IOException {
File dir2 = new File("F:\\FileTest");
listDirfiles(dir2);
}
// 输出:
[我的图片.png, 我的文件.txt, 我的文件2.txt, 新建文件夹1]
我的图片.png
我的文件.txt
我的文件2.txt
新建文件夹1
测试目录 F:\FileTest
可以看到, list方法只能列出当前文件夹下的文件。若有多层文件(F:\FileTest\新建文件夹1\新建文件夹2)则不能展示出来。
(3) 文件过滤
FileFilter 和 FilenameFilter 都是接口 , 它们只有一个accept方法, 但参数不同。通过实现accept方法达到过滤的目的。
public interface FileFilter {
boolean accept(File pathname);
}
interface FilenameFilter {
boolean accept(File dir, String name);
}
测试目录 F:\FileTest
// 对文件进行过滤
File[] filter = dir.listFiles(new FileFilter() {
@Override
// 设置过滤规则
public boolean accept(File pathname) {
// 匹配以txt结尾的文件
return pathname.getName().endsWith("txt");
}
});
System.out.println(Arrays.toString(filter));
// 输出:
[F:\FileTest\我的文件.txt, F:\FileTest\我的文件2.txt]