1.1 文件操作

java.io.File是Java提供的专⻔针对文件操作的类,File是文件与目录路径的一种抽象表示,用于操作文件与目录,不能操作文件内容。

构造File对象

一个File对象通常表示磁盘上一个真实存在的文件或目录,创建File对象时,无论对应的文件与目录是否存在,不会影响File对象的构造。

常用的三个构造File方法

方法 描述
public File(String pathname) 通过给定的路径名创建指定的File实例
public File(String parent String child) 根据指定的父路径与子路径字符串创建File实例
public File(File parent String child) 根据指定的父路径File与子路径字符串创建新的File实例
public static void main(String[] args) {
// 创建表示一个目录的File实例
File dir = new File("D://test");
// 创建表示文件的File实例
File sourceFile1 = new File("D://test", "source.txt");
// 根据父路径File实例创建新的File实例
File sourceFile2 = new File(dir, "source.txt");
}

常用的判断方法

方法 描述
public boolean exists() 判断文件或者目录是否存在
public boolean isDirectory() 判断File表示的路径是否是一个目录
public boolean isFile() 判断File表示的路径是否是一个文件
public boolean isHidden() 判断File是否是一个隐藏的文件与路径,即Unix以. 开始命名的文件或目录,Window需要在文件系统中 明确标记是否隐藏。
public boolean canRead() 判断是否可读
public boolean canWrite() 判断是否可写public boolean canExecute() 判断是否可执行
public static void main(String[] args) {
File hiddenSshDir = new File("D://test/hidden");
System.out.println(hiddenSshDir.isHidden()); // true
System.out.println(hiddenSshDir.isFile()); // false
System.out.println(hiddenSshDir.isDirectory()); //true
System.out.println(hiddenSshDir.exists()); // true
}

常用的获取属性方法

方法 描述
public String getName() 获取文件名或目录名,如source.txt
public String getAbsolutePath() 获取文件或目录绝对路径
public String getPath() 获取文件或目录相对路径,如果构造File时指定的就是绝对路径,则与getAbsolutePath返回内容一致,如果是相对路径,则以系统属性user.dir为目录创建。
public long length() 返回文件内容大小,单位字节。如果File表示的是目录,则返回0。
public static void main(String[] args) {
File sourceFile = new File("test/dir");
System.out.println(sourceFile.getName()); // dir
System.out.println(sourceFile.getAbsolutePath()); // D:\workspace\base-star-point\test\dir
System.out.println(sourceFile.getParent()); // test
System.out.println(sourceFile.getPath()); // test\dir
System.out.println(sourceFile.length()); // 0
}

操作文件方法

方法  描述 
public boolean createNewFile() 创建文件,如果文件已经存在,则返回false。
public boolean mkdir() 创建目录
public boolean mkdirs()
创建目录,父路径中任何一级目录不存在都会自动创
建,类似mkdir -p /data/test/dir 命令
public boolean delete() 删除文件或目录,如果File是一个目录,并且目录不
为空,则无法删除, 文件或目录正被其他程序使
用,也无法删除。
public boolean renameTo(File dest) 重命名文件,即移动文件

创建文件或目录

public static void main(String[] args) throws IOException {
File file = new File("D://test/txt");
boolean suc = file.createNewFile();
System.out.println(suc); // true,创建成功
suc = file.createNewFile();
System.out.println(suc); // false, 文件已经存在
suc = file.mkdir();
System.out.println(suc); // fasle, 相同路径名的文件已经存在,无法创建同名目录

File dir = new File("D://test/a/b/c");
suc = dir.mkdir();
System.out.println(suc); // false,无法创建目录c, 父目录D://test/a/b不存在
suc = dir.mkdirs();
System.out.println(suc); // true,整个目录D://test/a/b/c全部创建
}

重命名文件,将D://test/source.txt移动到D://test/sub目录,并命名为b.txt。

public static void main(String[] args) {
File source = new File("D://test/source.txt");
File dir = new File("D://test/sub");
dir.mkdir();
File target = new File("D://test/sub/b.txt");
System.out.println(source.renameTo(target));
}

创建临时文件

File提供了一个静态方法创建临时文件

// 未指定临时目录,使用系统属性java.io.tmpdir值作为临时目录
public static File createTempFile(String prefix, String suffix)
// 指定临时目录创建临时文件
public static File createTempFile(String prefix, String suffix, File directory)

创建临时文件时,可以指定系统临时目录,File类默认使用系统属性java.io.tmpdir( java -
XshowSettings:properties -version 查看)值作为临时目录,后缀未填写则默认为.tmp。

public static void main(String[] args) throws IOException {
Properties properties = System.getProperties();
properties.forEach((k,v) -> System.out.println(k + "=" + v));
// C:\Users\SUNJINFU\AppData\Local\Temp\test-1385972536118005697.log
System.out.println(File.createTempFile("test-", ".log"));
}

遍历文件目录

方法 描述
public String[] list() 返回目录下子文件与子目录名,不是目录直接返回null
public String[] list(FilenameFilter filter) 返回目录下符合文件名条件的子文件与子目录字符串名
public File[] listFiles() 与list方法类似,返回类型是File数组
public File[] listFiles(FilenameFilter filter) 返回目录下符合文件名条件的子文件或子目录File数组
public File[] listFiles(FileFilter filter) 返回目录下符合条件的子文件或子目录File数组

删除指定目录下的所有.txt文件

public static void main(String[] args) {
File file = new File("D://test");
// 通过name filter过滤出文件名后缀为.txt的文件
File[] files = file.listFiles((dir, name) -> name.endsWith(".txt"));
if (files != null) {
for (File f : files) {
f.delete();
}
}
}

删除目录,如果目录不为空,则需先遍历删除子文件、子目录

D:\test>tree /f
│ 1.log

├─a
│ a.txt

└─b
└─c
c.txt

删除D://test目录

public class DeleteDirectoryDemo {

public static void main(String[] args) {
File file = new File("D://test");
deleteFile(file);
}

public static void deleteFile(File file) {
// 判断文件是否存在
if (!file.exists()) {
return;
}
// 如果是文件,直接删除
if (file.isFile()) {
if (!file.delete()) {
System.out.println("failed to delete file: " + file.getAbsolutePath());
}
return;
}
// 如果是目录,则先遍历删除目录下文件或者子目录
File[] files = file.listFiles();
if (Objects.nonNull(files) && files.length > 0) {
for (File f : files) {
deleteFile(f);
}
}
// 最后删除目录
if (!file.delete()) {
System.out.println("failed to delete directory: " + file.getAbsolutePath());
}
}
}

Files

从Java7开始,在java.nio.file包下提供了一个文件或者目录操作工具类Files,F iles的方法基本都是静
态方法,该类不仅能操作文件,还能结合IO流操作文件内容。与File类相比,Files的很多方法都能明确
的返回操作失败的异常信息,而不是只返回简单的true或者false。

如test目录不存在时直接使用Files创建source.txt

// Exception in thread "main" java.nio.file.NoSuchFileException:
D:\test\source.txt
Files.createFile(Paths.get("D://test/source.txt"));

删除不存在的文件

// Exception in thread "main" java.nio.file.NoSuchFileException: D:\test\1.txt
Files.delete(Paths.get("D://test/1.txt"));

Files提供了非常丰富的方法,按功能分为如下几类方法
image.png