我们的程序经常需要获取磁盘上文件的相关信息或在磁盘上创建新的文件,这就需要用到File类。需要注意的是:File类的对象主要用来获得文件本身的信息,而不涉及对文件的读写操作。
创建File类对象
创建File类有4个方法
· File(String filename) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
· File(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。
· File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
· File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
获取文件的属性
经常使用File类的下列方法来获取文件本身的一些信息
· public boolean exists() 判断文件或目录是否存在。
· public boolean isFile() 判断文件是否是一个普通文件,而不是目录。
· public boolean isDirectory() 判断文件是否是一个目录。
· public boolean isHidden() 判断文件是否是隐藏文件。
· public boolean canRead() 判断文件是否是可读的。
· public boolean canWrite() 判断文件是否是可写的。
· public String getName() 获取文件名字。
· public String getAbsolutePath() 获取文件的绝对路径。
· public String getParent() 获取文件的父目录。
· public long length() 获取文件长度(单位是字节)。
· public long lastModified() 获取文件最后的修改时间(单位是毫秒)。
测试类 FileTest.java
准备工作:在桌面上新建一个文件夹dirTest,再在里面新建一个文本文档,完整路径为:C:\Users\PRO\Desktop\dirTest\fileTest.txt,里面随便写点什么内容。
package com.fs.file;
import java.io.File;
public class FileTest {
public static void main(String[] args) {
// 获取文件对象,注意使用转义字符
File file = new File("C:\\Users\\PRO\\Desktop\\dirTest\\fileTest.txt");
// 判断文件是否存在 true
System.out.println(file.exists());
// 判断文件是否是一个普通文件 true
System.out.println(file.isFile());
// 判断文件是否是一个目录 false
System.out.println(file.isDirectory());
// 判断文件是否可读 true
System.out.println(file.canRead());
// 判断文件是否可写 true
System.out.println(file.canWrite());
// 判断文件是否隐藏 false
System.out.println(file.isHidden());
// 获取文件名字 fileTest.txt
System.out.println(file.getName());
// 获取文件绝对路径 C:\Users\PRO\Desktop\dirTest\fileTest.txt
System.out.println(file.getAbsolutePath());
// 获取文件的父目录 C:\Users\PRO\Desktop\dirTest
System.out.println(file.getParent());
// 获取文件长度 9971
System.out.println(file.length());
// 获取文件最后修改时间 1517796006952
System.out.println(file.lastModified());
}
}
目录
目录与文件的创建与删除
· public boolean createNewFile() 创建普通文件。
· public boolean mkdir() 创建目录。
· public boolean delete() 删除文件或目录。
列出目录中的文件
· public String[] list() 用字符串的形式返回目录下的全部文件
· public File[] listFiles() 用File对象的形式返回目录下的全部文件
· public String[] list(FilenameFilter obj) 用字符串的形式返回目录下指定类型的全部文件
· public File[] listFiles(FilenameFilter obj) 用File对象的形式返回目录下指定类型的全部文件
FilenameFliter接口
· 该接口有一个方法,第一个参数是指要查询的文件夹,第二个参数是指指定的类型
public boolean accept(File dir, String name);
· 当File对象是一个目录且调用list(FilenameFilter obj)或listFiles(FilenameFilter obj)方法时,obj不断回掉接口方法,当返回值为true时,list方法就将名字为name的文件存放到返回的数组中。
测试类 DirTest.java
package com.fs.file;
import java.io.File;import java.io.FilenameFilter;import java.io.IOException;import java.util.Arrays;
public class DirTest {
public static void main(String[] args) throws IOException {
// 获取File的目录对象
File dirFile = new File("C:\\Users\\PRO\\Desktop\\dirTest2");
// 在磁盘中创建目录
System.out.println(dirFile.mkdir());
// 在目录中循环创建5个txt文件和java文件
for (int i = 0; i < 5; i++) {
File txtFile = new File("C:\\Users\\PRO\\Desktop\\dirTest2\\texFile" + i + ".txt");
File javaFile = new File("C:\\Users\\PRO\\Desktop\\dirTest2\\javaFile" + i + ".java");
System.out.println(txtFile.createNewFile());
System.out.println(javaFile.createNewFile());
}
// 数组里面装的是文件名 如javaFile0.java
String[] list = dirFile.list();
System.out.println(Arrays.toString(list));
// 数组里面装的是文件,以全路径的方式表现出来 如C:\Users\PRO\Desktop\dirTest2\javaFile0.java
File[] listFiles = dirFile.listFiles();
System.out.println(Arrays.toString(listFiles));
// 通过匿名内部类的方式来实现FilenameFilter接口,获取所有以“.java”结尾的文件
String[] javaList = dirFile.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
System.out.println(Arrays.toString(javaList));
// 通过自己编写类来实现FilenameFilter接口,获取所有以“.txt”结尾的文件
MyFlieFilter myFlieFilter = new MyFlieFilter(".txt");
String[] txtList = dirFile.list(myFlieFilter);
System.out.println(Arrays.toString(txtList));
}
}
自己编写的实现FilenameFiler接口的类 MyFlieFilter.java
package com.fs.file;
import java.io.File;import java.io.FilenameFilter;
public class MyFlieFilter implements FilenameFilter{
// 定义一个私有变量,表示要查找的文件类型
private String filerName;
// 重写接口中的方法
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(filerName);
}
public String getFilerName() {
return filerName;
}
public void setFilerName(String filerName) {
this.filerName = filerName;
}
public MyFlieFilter(String filerName) {
super();
this.filerName = filerName;
}
}
小案例 删除指定文件夹(如缓存目录)ClearCache.java
· 我们知道,普通文件能直接删除,但是当目录下还有文件或目录时,不能直接调用delete()方法删除目录,那么我们就只能通过递归来删除目录了。
package com.fs.file;
import java.io.File;import java.io.IOException;
public class ClearCache {
public static void main(String[] args) throws IOException {
// creatCacheDir();
File file = new File("C:\\Users\\PRO\\Desktop\\cacheTest");
deleteAllFile(file);
}
// 创建缓存文件夹,里面包含多个文件夹和文件,并还有多层结构
public static void creatCacheDir() throws IOException {
File cacheDir = new File("C:\\Users\\PRO\\Desktop\\cacheTest");
cacheDir.mkdir();
for (int i = 0; i < 5; i++) {
File childDir = new File("C:\\Users\\PRO\\Desktop\\cacheTest\\childDir" + i);
File childFile = new File("C:\\Users\\PRO\\Desktop\\cacheTest\\childFile" + i);
childDir.mkdir();
childFile.createNewFile();
for (int j = 0; j < 5; j++) {
File grandChildDir = new File("C:\\Users\\PRO\\Desktop\\cacheTest\\childDir" + i + "\\grandChildDir" + j);
File grandChildFile = new File("C:\\Users\\PRO\\Desktop\\cacheTest\\childDir" + i + "\\grandChildFile" + j);
grandChildDir.mkdir();
grandChildFile.createNewFile();
}
}
}
// 递归删除文件夹
public static void deleteAllFile(File file) {
// 如果文件为空,直接返回
if (file == null) {
return;
}
if (file.exists()) {
if (file.isFile()) {
// 如果该文件是普通文件,直接删除
file.delete();
System.out.println("已删除文件" + file.getName());
} else if (file.isDirectory()) {
// 如果该文件是目录,则循环遍历该目录,再递归删除该文件
// 获得该目录下所有文件
File[] files = file.listFiles();
// 跳出递归条件:该目录下文件已经被删完
if (files == null) {
return;
}
// 自己调用自己,递归删除文件
for (File subFile : files) {
deleteAllFile(subFile);
}
}
// 删除文件本身
file.delete();
}
}
}
Java热点新闻